zoukankan      html  css  js  c++  java
  • 一个站点的诞生06-- ORM

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

    一般用Mysql,也实用sqlite,Postgre。操作数据库要会SQL语言,这个有点麻烦,经常须要查手冊。

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


    于是。ORM就出现了。


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

    假如要处理特殊字符或者国际化字符,用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。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存数据,又快又好,再也不用操心容量和速度问题,这就是另外一个话题了。

  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5209881.html
Copyright © 2011-2022 走看看