sqlalchemy學習筆記

發表於2016-09-23

SQLAlchemy是python的一個資料庫ORM工具,提供了強大的物件模型間的轉換,可以滿足絕大多數資料庫操作的需求,並且支援多種資料庫引擎(sqlite,mysql,postgres, mongodb等),在這裡記錄基本用法和學習筆記

一、安裝

通過pip安裝

二、使用

首先是連線到資料庫,SQLALchemy支援多個資料庫引擎,不同的資料庫引擎連線字串不一樣,常用的有

更多連線字串的介紹參見這裡

下面是連線和使用sqlite資料庫的例子

1. connection

使用傳統的connection的方式連線和運算元據庫

與python自帶的sqlite不同,這裡不需要Cursor游標,執行sql語句不需要commit

2. connection事務

使用事務可以進行批量提交和回滾

3. session

connection是一般使用資料庫的方式,sqlalchemy還提供了另一種運算元據庫的方式,通過session物件,session可以記錄和跟蹤資料的改變,在適當的時候提交,並且支援強大的ORM的功能,下面是基本使用

上面建立了一個session物件,接下來可以運算元據庫了,session也支援通過sql語句運算元據庫

注意引數使用dict,並在sql語句中使用:key佔位

4. ORM

上面簡單介紹了sql的簡單用法,既然是ORM框架,我們先定義兩個模型類UserRole,sqlalchemy的模型類繼承自一個由declarative_base()方法生成的類,我們先定義一個模組Models.py生成Base類

User.py

Role.py

從上面很容易看出來,這裡的模型對應資料庫中的表,模型支援的型別有Integer, String, Boolean, Date, DateTime, Float,更多型別包括型別對應的Python的型別參見:這裡

Column建構函式相關設定

  • name:名稱
  • type_:列型別
  • autoincrement:自增
  • default:預設值
  • index:索引
  • nullable:可空
  • primary_key:外來鍵

更多介紹參見這裡

接下來通過session進行增刪改查

5. 多表關係

上面的所有操作都是基於單個表的操作,下面是多表以及關係的使用,我們修改上面兩個表,新增外來鍵關聯(一對多和多對一)

User模型

Role模型

這裡有一點需要注意的是,設定外來鍵的時候ForeignKey('roles.id')這裡面使用的是表名和表列,在設定關聯屬性的時候relationship('Role', foreign_keys='User.role_id', backref='User_role_id'),這裡的foreign_keys使用的時候類名和屬性名

接下來就可以使用了

上面表示的是一對多(多對一)的關係,還有一對一,多對多,如果要表示一對一的關係,在定義relationship的時候設定uselist為False(預設為True),如在Role中

6. 多表查詢

多表查詢通常使用join進行表連線,第一個引數為表名,第二個引數為條件,例如

join為內連線,還有左連線outerjoin,用法與join類似,右連線和全外連結在1.0版本上不支援,通常來說有這兩個結合查詢的方法基本夠用了,1.1版本貌似新增了右連線和全外連線的支援,但是目前只是預覽版

還可以直接查詢多個表,如下

三、資料庫遷移

sqlalchemy的資料庫遷移/升級有兩個庫支援alembicsqlalchemy-migrate

由於sqlalchemy-migrate在2011年釋出了0.7.2版本後,就已經停止更新了,並且已經不維護了,也積累了很多bug,而alembic是較後來才出現,而且是sqlalchemy的作者開發的,有良好的社群支援,所以在這裡只學習alembic這個庫

alembic實現了類似git/svn的版本管理的控制,我們可以通過alembic維護每次升級資料庫的版本

1. 安裝

通過pip安裝,pip會自動安裝相關的依賴

2. 初始化

安裝完成後再專案根目錄執行

alembic會在根目錄建立YOUR_ALEMBIC_DIR目錄和alembic.ini檔案,如下

其中

  • alembic.ini 提供了一些基本的配置
  • env.py 每次執行Alembic都會載入這個模組,主要提供專案Sqlalchemy Model 的連線
  • script.py.mako 遷移指令碼生成模版
  • versions 存放生成的遷移指令碼目錄

預設情況下建立的是基於單個資料庫的,如果需要支援多個資料庫或其他,可以通過alembic list_templates檢視支援的模板

3. 配置

使用之前,需要配置一下連結字串,開啟alembic.ini檔案,設定sqlalchemy.url連線字串,例如

其他引數可以參見官網說明:http://alembic.zzzcomputing.com/en/latest/tutorial.html

4. 建立資料庫版本

接下來我們建立一個資料庫版本,並新建兩個表

建立一個版本(會在yourproject/YOUR_ALEMBIC_DIR/versions/資料夾中建立一個python檔案1a8a0d799b33_create_table.py

該python模組包含upgradedowngrade兩個方法,在這裡新增一些新增表的邏輯

這裡使用到了了op物件,關於op物件的更多API使用,參見這裡

5. 升級資料庫

剛剛實現了升級和降級的方法,通過下面命令升級資料庫到最新版本

這時候可以看到資料庫多了兩個表alembic_versionaccountalembic_version存放資料庫版本

關於升級和降級的其他命令還有下面這些

6. 通過後設資料升級資料庫

上面我們是通過API升級和降級,我們也可以直接通過後設資料更新資料庫,也就是自動生成升級程式碼,先定義兩個Model(User, Role),這裡我定義成三個檔案

程式碼就放在一起了

YOUR_ALEMBIC_DIR/env.py配置後設資料

改為

os.path.join(os.getcwd()這個獲取到的地址不是env.py的路徑,而是根目錄

在建立資料庫版本的時候新增--autogenerate引數,就會從Base.metadata後設資料中生成指令碼

這時候會在生成升級程式碼

由於我沒有定義account模型,會被識別為刪除,如果刪除了model的列的宣告,則會被識別為刪除列,自動生成的版本我們也可以自己修改,然後執行升級命令即可升級alembic upgrade head

需要注意的是

  1. Base.metadata宣告的類必須以資料庫中的一一對應,如果資料庫中有的表,而在後設資料中沒有,會識別成刪除表
  2. revision建立版本之前執行之前需要升級到最新版本
  3. 配置Base之前,需要保證所有的Model都已經執行(即匯入)過一次了,否則無法讀取到,也就是需要把所有Model都import進來

資料庫升級有風險,升級前最好先檢查一遍upgrade函式,可以的話做好備份哈

四、常見問題

1. String長度問題

如果使用mysql資料庫,String型別對應的是VARCHAR型別,需要指定長度,否則會報下面錯誤,而在sqlite不會出現

TODO:如有其他問題歡迎留言

五、參考連結

相關文章