首页 > 代码库 > 一个网站的诞生06-- ORM
一个网站的诞生06-- ORM
网站上的数据,存在数据库里。一般用Mysql,也有用sqlite,Postgre。操作数据库要会SQL语言,这个有点麻烦,常常需要查手册。此外,每家数据库在实现SQL语言的时候,常常会加料,增加一些自己独有的东西。而且,SQL语言不是面向对象/基于对象,很多抽象更高的东西不能使用。
于是,ORM就出现了。
ORM是Object Relation Model,也就是 对象关系映射。简而言之,ORM将将数据库的记录表示成对象。选择一个好的ORM,由它的层面解决数据库和SQL语言问题,可以很开心。程序里用ORM好处多多,不需要写SQL语言了,更换新数据库只需要修改配置,不用对代码做大改,在不同的OS上迁移也容易。假如要处理特殊字符或者国际化字符,用ORM比SQL语言方便得多,特殊字符和国际化字符是个噩梦,做过的人都知道!ORM的对象还可以实现更多特性,诸如类的继承和组合。
各种ORM框架太多了,Java的ORM框架出名的有十几个。Python的大点开源项目往往自己实现一个ORM框架,比如Django。
我个人推荐SQLAlchemy,好处是支持的数据库多,开发的年头久,版本比较稳定,也有几家出名的网站用,如Yelp,reddit,openstack,dropbox。
可以通过pip安装,也可以下载源代码解压缩,然后以setup的方式安装。
至于使用方式,本文只能给一个极为简单的例子,SQLAlchemy的文档有一千多页,用的时候查查文档吧。
SQLAlchemy的示例代码dborm.py,内容如下:
---------------------------------------
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class ShopPos(Base):
__tablename__ = "ShopPosTable"
shopid = Column(String(100), primary_key=True)
lng = Column(Float)
lat = Column(Float)
def __repr__(self):
return("<ShopPosTable(shopid=‘%s‘, lng=‘%s‘, lat=‘%s‘)>" %(self.shopid,
self.lng, self.lat))
engine = sqlalchemy.create_engine(
"mysql://dbuser1:dbpasswd1@localhost:3306/dbname1?charset=utf8",
encoding="utf-8",
echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
orm_session = Session()
if __name__ == "__main__":
for i in orm_session.query(ShopPos).all():
print i
---------------------------------------
在执行这个py文件之前,主机需要安装mysql,并创建名称是dbname1的database,创建数据库用户dbuser1,密码dbpasswd1,它有本地登录mysql的权限。在dbname1里,有一张表叫ShopPosTable,它有3个字段,记录餐厅的经纬度值,主键是餐厅shopid,里面填写几个测试记录。这个py文件看起来蛮多的,其实大部分内容都是固定格式,真正要实现的就是类ShopPos。
这条语句,是从ShopPos表里把所有的记录取出来,然后打印显示。
for i in orm_session.query(ShopPos).all(): print i
数据库操作的crud,也就是增查改删,也都是按照类似的方式来。
有了SQLAlchemy之后,就可以将前面几个Spider抓取到到的内容,存到mysql数据库里。
如果做分布式抓取,就不需要用SQLAlchemy,可以直接在S3上存储,或者用公网ip开一个Hadoop集群,装上HBase存数据,又快又好,再也不用担心容量和速度问题,这就是另外一个话题了。
于是,ORM就出现了。
ORM是Object Relation Model,也就是 对象关系映射。简而言之,ORM将将数据库的记录表示成对象。选择一个好的ORM,由它的层面解决数据库和SQL语言问题,可以很开心。程序里用ORM好处多多,不需要写SQL语言了,更换新数据库只需要修改配置,不用对代码做大改,在不同的OS上迁移也容易。假如要处理特殊字符或者国际化字符,用ORM比SQL语言方便得多,特殊字符和国际化字符是个噩梦,做过的人都知道!ORM的对象还可以实现更多特性,诸如类的继承和组合。
各种ORM框架太多了,Java的ORM框架出名的有十几个。Python的大点开源项目往往自己实现一个ORM框架,比如Django。
我个人推荐SQLAlchemy,好处是支持的数据库多,开发的年头久,版本比较稳定,也有几家出名的网站用,如Yelp,reddit,openstack,dropbox。
可以通过pip安装,也可以下载源代码解压缩,然后以setup的方式安装。
至于使用方式,本文只能给一个极为简单的例子,SQLAlchemy的文档有一千多页,用的时候查查文档吧。
SQLAlchemy的示例代码dborm.py,内容如下:
---------------------------------------
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class ShopPos(Base):
__tablename__ = "ShopPosTable"
shopid = Column(String(100), primary_key=True)
lng = Column(Float)
lat = Column(Float)
def __repr__(self):
return("<ShopPosTable(shopid=‘%s‘, lng=‘%s‘, lat=‘%s‘)>" %(self.shopid,
self.lng, self.lat))
engine = sqlalchemy.create_engine(
"mysql://dbuser1:dbpasswd1@localhost:3306/dbname1?charset=utf8",
encoding="utf-8",
echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
orm_session = Session()
if __name__ == "__main__":
for i in orm_session.query(ShopPos).all():
print i
---------------------------------------
在执行这个py文件之前,主机需要安装mysql,并创建名称是dbname1的database,创建数据库用户dbuser1,密码dbpasswd1,它有本地登录mysql的权限。在dbname1里,有一张表叫ShopPosTable,它有3个字段,记录餐厅的经纬度值,主键是餐厅shopid,里面填写几个测试记录。这个py文件看起来蛮多的,其实大部分内容都是固定格式,真正要实现的就是类ShopPos。
这条语句,是从ShopPos表里把所有的记录取出来,然后打印显示。
for i in orm_session.query(ShopPos).all(): print i
数据库操作的crud,也就是增查改删,也都是按照类似的方式来。
有了SQLAlchemy之后,就可以将前面几个Spider抓取到到的内容,存到mysql数据库里。
如果做分布式抓取,就不需要用SQLAlchemy,可以直接在S3上存储,或者用公网ip开一个Hadoop集群,装上HBase存数据,又快又好,再也不用担心容量和速度问题,这就是另外一个话题了。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。