一个站点的诞生06-- ORM

站点上的数据,存在数据库里。

通常用Mysql,也实用sqlite,Postgre。操做数据库要会SQL语言,这个有点麻烦,常常需要查手冊。python

此外。每家数据库在实现SQL语言的时候,常常会加料,添加一些本身独有的东西。而且,SQL语言不是面向对象/基于对象,很是多抽象更高的东西不能使用。


因而。ORM就出现了。


ORM是Object Relation Model,也就是 对象关系映射。简而言之。ORM将将数据库的记录表示成对象。选择一个好的ORM。由它的层面解决数据库和SQL语言问题,可以很是开心。程序里用ORM优势多多,不需要写SQL语言了,更换新数据库仅仅需要改动配置,不用对代码作大改,在不一样的OS上迁移也easy。mysql

假如要处理特殊字符或者国际化字符,用ORM比SQL语言方便得多,特殊字符和国际化字符是个噩梦,作过的人都知道!sql

ORM的对象还可以实现不少其它特性,诸如类的继承和组合。


各类ORM框架太多了。Java的ORM框架出名的有十几个。Python的大点开源项目每每本身实现一个ORM框架,比方Django。


我我的推荐SQLAlchemy。优势是支持的数据库多。开发的年头久,版本号比較稳定,也有几家出名的站点用。如Yelp,reddit,openstack,dropbox。


可以经过pip安装。也可以下载源码解压缩。而后以setup的方式安装。数据库




至于使用方式,本文仅仅能给一个极为简单的样例,SQLAlchemy的文档有一千多页。用的时候查查文档吧。session




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。passworddbpasswd1,它有本地登陆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存数据,又快又好,不再用操心容量和速度问题,这就是另一个话题了。 分布式

相关文章
相关标签/搜索