alembic 遷移數據庫


使用Alembic遷移數據庫

Alembic 是 SQLAlchemy 作者編寫的 Python 數據庫遷移工具。我打算用它實現模型類和數據庫的同步更新,就先看了些資料,學習如何實現該功能。

1. 安裝

通過pip安裝,會自動安裝依賴包SQLAlchemy、Mako和MarkupSafe。

 

SAE Python環境中只需安裝Mako,其他兩個均為內置模塊。

安裝完成后就可以使用 alembic 命令,所有 Alembic 操作均由該命令實現(感覺類似git)。

 

2. 初始化

與 Git 類似,使用 Alembic 前需要通過 alembic init 命令創建一個 alembic 項目,該命令創建一個 alembic.ini 配置文件和一個 alembic 檔案目錄(YOUR_ALEMBIC_DIR)。在合適的位置運行

我在模塊包目錄下創建目錄alembic,目錄結構如下:

 

3. 創建模型類

創建一個使用 SQLAlchemy 定義數據庫模型,比如下面這種

上面例子在 Model 中定義兩個表 user 和 repo。

4. 修改配置文件

在 alembic.ini 中設置數據庫連接

為了使用模型類更新數據庫,需要在 env.py 中設置,將 target_metadata 賦值成數據庫的元數據(metadata)。原有配置如下

可修改為

自此,alembic 將可以獲取模型模塊中定義的信息。

5. 自動創建版本

切換到alembic.ini所在目錄,用 alembic revision -m+注釋 創建數據庫版本。由於我提供了模型類,所以可以用–autogenerate參數自動生成遷移腳本。運行

生成的數據庫遷移腳本如下:

兩個函數用於數據庫的升級和降級。

6. 更新數據庫

升級數據庫使用 alembic upgrade,降級使用 alembic downgrade。更新到最新版

查看數據庫,發現已經創建 user, repo 表。還有一個表叫做alembic_version,只有一個字段和一個值version_num,記錄當前的數據庫版本。

7. 手動創建腳本

自動創建腳本有限制,另外諸如插入初始數據條目的任務無法自動創建,所以使用 Alembic 更常見的方法就是自己編寫 upgrade 和 downgrade 腳本。

創建一個新的版本:

 

 

生成一個新的版本

 

 

修改上面的 upgrade 和 downgrade 函數就可以定制數據庫遷移規則。例如下面的例子中,upgrade 負責插入初始數據,而 download 負責將這些初始數據刪除:

 

上述的例子中,downgrade有bug,無法再有其他數據的情況下實現降級,不過該降級沒有實際意義,不如將數據庫整個清空。

參考

alembic官方教程 http://alembic.readthedocs.org/en/latest/tutorial.html

《Alembic 簡明教程》http://huangx.in/18/alembic-simple-tutorial

《使用alembic》 http://my.oschina.net/banxi/blog/126695

sqlalchemy-migrate 另一款適用於SQLAlchemy的數據庫遷移工具

附錄

我在SAE Python本地開發環境中使用遇到問題,代碼中使用pylibmc庫,但SAE Python本地開發環境用sae.memcache模塊代替pylibmc模塊,dev_server.py中有下面的代碼

 

 

直接使用pylibmc在dev_server.py下沒有問題,但運行alembic程序時則會提示找不到該模塊。為了解決這個問題,我判斷是本地開發環境還是線上開發環境,分別載入不同的庫。

 

 

問題

SAE線上環境使用的SQLAlchemy版本為0.7.10,使用Alembic時出現如下錯誤:

似乎對MetaData的支持不夠,版本號過低。升級成0.8.5,就可以正常使用。

重新生成腳本

我使用Alembic時,已經使用SQLAlchemy建立初始模型的數據表,不是從零開始,所以無法使用Alembic完整遷移數據庫。所以,我使用Alembic重新生成數據庫遷移腳本。

Alembic在數據庫中僅保存當前版本號,其余信息均從文件讀取。刪除歷史記錄,只需要將數據庫表刪除,並刪除versions下的所有文件。而alembic.ini和env.py中的設置無需更改,可以再次使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM