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