最近正好在尋求一種Python的資料庫ORM (Object Relational Mapper),SQLAlchemy (項目首頁)這個開源項目進入了我的視線,本來想嘗試著使用Django的ORM模組的,無奈Django的模組聯絡比較緊密,沒能單獨分拆下來,一定程度上說明Django自成體系的生態系統在給我們帶來快速便捷的開發環境的同時犧牲了組裝的靈活性。
初次學習,也沒實質感覺到SQLAlchemy的好處,不過看其介紹的很多大公司均採用該項目,而且其支援的資料庫還是蠻豐富的,所以我覺得花點時間研究還是值得的。不過令人遺憾的是關於SQLAlchemy的中文資料比較少,所以對於我們這種英語不佳的帶來了一定的麻煩。
研究一個項目最好的辦法就是閱讀其官方提供的說明文檔,當然很輕鬆就找到了SQLAlchemy的文檔 (0.7)。文檔的格式和大多數項目一樣,有下載安裝說明,有樣本,有快速上手教程。不過我還是習慣下載個PDF慢慢研究。
下面就將我近期的閱讀學習做個筆記,當然這個僅供參考,裡面可能有自己的一些猜測和想法,不作權威依據,不當之處還希望指出。
1. 安裝SQLAlchemy
安裝部分不打算詳細介紹,可以通過easy_install或者pip進行安裝,命令如下:
代碼如下:
easy_install SQLAlchemy
# 或者
pip install SQLAlchemy
當然我使用的是Windows環境,所以傾向於使用setup.py安裝,下載壓縮包,解壓,然後命令提示字元下切換到該目錄,再運行下面的命令:
代碼如下:
python setup.py install
這裡需要注意的是預設安裝會編譯安裝C擴充,這些C擴充將直接編譯為二進位機器碼然後為SQLAlchemy處理資料集加速,這個是很不錯的功能,遺憾的是Windows下提示編譯安裝擴充失敗,當然這不影響SQLAlchemy的使用,只是作為效能上的最佳化,本機開發環境可以不需要這些擴充,如果不需要可以嘗試下面的命令:
代碼如下:
pip install --global-option='--without-cextensions' SQLAlchemy
# 或者setup.py方式
python setup.py --without-cextensions install
好了,到這裡安裝部分我就簡單介紹完了,如果對這部分感興趣的話可以移步文檔。
最後可以檢驗一下安裝成果:
代碼如下:
>>> import sqlalchemy
>>> sqlalchemy.__version__
0.7.0
2. 簡單的查詢
就像任何新語言都是從萬能的'Hello World'開始一樣,先簡單體驗一把SQLAlchemy,由於SQLAlchemy是管理資料庫的,所以我們需要一個資料庫,自從用了Python以後,一提到資料庫,拿來做實驗的首當其衝的就是Python內建的SQLite3,這次我們連SQLite的資料庫檔案都不需要指定了,直接建立一份基於記憶體的資料庫,也就是說資料檔案存放在記憶體中,便於我們下面的測試。
我們使用create_engine建立資料庫連接引擎:
代碼如下:
>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
create_engine的第一個參數'sqlite:///:memory:'我們知道是建立資料庫連接的,那第二個參數echo=True是做什麼的呢,其實如果echo=True那麼SQLAlchemy將會通過Python標準模組logging來輸出日誌,如果你在操作互動式命令控制台,一些資訊將會被輸出,這裡我們可能會看到SQLAlchemy產生的一些SQL語句,這個對於我們學習和調試是很有必要的,所以在這裡我們將其設定為True,否則,如果不願意SQLAlchemy這麼囉嗦的話可以設定為False,這樣就看不到這些資訊啦。
create_engine()將會返回一個Engine引擎執行個體(instance),其代表著SQLAlchemy對於資料庫的核心介面,其隱藏了各種資料庫方言(dialect)的細節,實際上SQLAlchemy的底層是Python的DBAPI。
需要注意的是此時並沒有實質上與資料庫建立串連,什麼時候才會與資料庫真正建立串連呢?這個只會在你第一次查詢資料庫的時候發生。呃…這個有點像Lazy Loading (懶惰載入,消極式載入),也就是說我們需要真正操作資料庫的時候才真正建立串連。SQLAlchemy很多地方用到了Lazyload,以後會有機會和大家介紹的。
接下來我們來執行第一條SQL語句,同時建立資料庫連接:
代碼如下:
>>> engine.execute("select 1").scalar()
1
好了,當engine.execute執行時,Engine終於建立起實質上資料庫連接了。
Engine對於資料庫連接的管理採取的是資料庫連接池 (Pool),當串連第一次建立,SQLAlchemy將會將建立的串連放入內部的串連池中以便於隨後的資料動作陳述式執行時複用。
當然關於Engine的用法並不是SQLAlchemy精彩的ORM部分,隨後我們會介紹將Engine綁定到ORM,然後使用對象來操作資料庫部分。