一個站點的誕生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存數據,又快又好,不再用操心容量和速度問題,這就是另一個話題了。 分佈式

相關文章
相關標籤/搜索