• 一个站点的诞生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存数据,又快又好,再也不用操心容量和速度问题,这就是另外一个话题了。

  • 相关阅读:
    构建之法阅读笔记02
    NOPI2018 货币系统 bool完全背包 bitset优化转移
    P4551 最长异或路径 Trie经典应用 bitset应用
    算法分析与设计实验报告 Project2
    ARC-114 C- Sequence Scores 计数
    P2401 不等数列 简单计数DP
    Gym-102569C Manhattan Distance 曼哈顿距离的转换 二分
    GYM-102893J Straight 模拟 思维
    算法分析与设计实验报告 Project1
    CodeForces Round 705-D GCD of an Array 数论 乱搞 or 线段树 + 质因子分解科技
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5209881.html
Copyright © 2020-2023  润新知