使用alembic進行數據庫版本管理


前言


隨着項目業務需求的不斷變更,數據庫的表結構修改難以避免,此時就需要對數據庫的修改加以記錄和控制,便於項目的版本管理和隨意的升級和降級。

Alembic就可以很好的解決這個問題。Alembic是SQLAlchemy作者開發的Python數據庫版本管理工具。

 

安裝


pip install alembic

通過pip命令安裝,如果使用虛擬環境,記得激活虛擬環境后再執行pip命令

同時需要安裝的還有SQLAlchemy和PyMysql

pip install sqlalchemy
pip install pymysql

 

初始化


在使用alembic之前,需要進行初始化操作。

alembic init <YOUR_ALEMBIC_DIR>

YOUR_ALEMBIC_DIR,可以取一個符合項目名稱規范的目錄名,如

alembic init alembic

此時需要注意,如果之前是在虛擬環境中安裝的alembic,需要激活虛擬環境后,在執行上述命令。

同時,建議cd到項目根目錄再執行初始化操作,因為YOUR_ALEMBIC_DIR會在當前目錄下創建。

顯示類似結果即初始化成功。

Creating directory D:\Project\py_sqlalchemy_demo\alembic ... done
Creating directory D:\Project\py_sqlalchemy_demo\alembic\versions ... done
Generating D:\Project\py_sqlalchemy_demo\alembic.ini ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\env.py ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\README ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\script.py.mako ... done
Please edit configuration/connection/logging settings in 'D:\\Project\\py_sqlalchemy_demo\\alembic.ini' befor
e proceeding.

初始化成功后,會在執行初始化命令的目錄下,生成一個alembic.ini的配置文件,及一個alembic目錄,目錄名就是之前設置的YOUR_ALEMBIC_DIR。

 

修改配置文件


接下來對alembic.ini的信息進行修改。

主要修改的是配置文件中的數據庫連接部分。

sqlalchemy.url = driver://user:pass@localhost:port/dbname

將配置文件中,此部分替換成對應的數據庫連接,這個數據庫連接的寫法是與SQLAlchemy創建engine時是一樣的。

如我在demo中使用的是SQLAlchemy與PyMysql,那數據庫連接就是類似如下

mysql+pymysql://demo_user:demo123456@127.0.0.1:3306/demo_db

 

修改env.py


除修改配置文件外,還需要對YOUR_ALEMBIC_DIR目錄下的env.py文件進行修改。

在env.py中,將target_metadata設置成項目的model,使alembic能獲取到項目中model定義的信息。

將原先的

target_metadata = None

修改成項目中的model

import os
import sys
# 此處需要將項目路徑添加到sys.path,否則from import時找不到models
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
from models.base import BaseModel
target_metadata = BaseModel.metadata

 

創建新版本


用 alembic revision -m+注釋 創建數據庫版本

alembic revision --autogenerate -m "init db"

運行后,類似如下結果,即創建版本成功

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected removed table 'user'
Generating D:\Project\py_sqlalchemy_demo\alembic\versions\7b55b3d83158_create_tables.py ... done

每次修改過SQLAlchemy的model,執行此命令即可創建對應的版本。

執行成功后,會在項目根目錄下的alembic/versions/下生成的對應版本的py文件。命令規則是版本號+注釋。(這個命名規則是在配置文件中定義的)

在每次創建新版本后,需要執行將數據庫升級到新版本的命令,才能繼續更新版本。

 

變更數據庫


在每次創建新版本后,需要執行將數據庫升級到新版本的命令,才能繼續更新版本

將數據庫升級到最新版本

alembic upgrade head

運行結果類似

(venv_win) D:\Project\py_sqlalchemy_demo>alembic upgrade head
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 7b55b3d83158 -> b034414f04cd, create tables02

其中,命令中的head和base特指最新版本和最初版本。當需要對數據庫進行升級時,使用upgrade,降級使用downgrade。

將數據庫降級到最初版本

alembic downgrade base

將數據庫降級到執行版本,使用alembic downgrade+版本號,不包含注釋部分

alembic downgrade <version>

alembic downgrade 7b55b3d83158

運行結果

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running downgrade b034414f04cd -> 7b55b3d83158, create tables02

升級也是同樣的道理,alembic upgrade+版本號

 

 

離線更新(生成sql腳本)


在某些不適合在線更新的情況,可以采用生成sql腳本的形式,進行離線更新:

alembic upgrade <version> --sql > migration.sql

如:

alembic upgrade ae1027a6acf --sql > migration.sql

從特定起始版本生成sql腳本:

alembic upgrade <vsersion>:<vsersion> --sql > migration.sql

如:

alembic upgrade 1975ea83b712:ae1027a6acf --sql > migration.sql

如果是數據庫降級操作,把upgrade替換為downgrade。

 

查詢當前數據庫版本號


在對數據庫進行升級或降級后,會在當前操作的數據庫中新增一個表;alembic_version。

表中的version_num字段記錄了當前的數據庫版本號。

 

清除所有版本


如果需要清除所有的版本,將versions刪除掉,同時刪除數據庫的alembic_version表。

 

參考資料

http://alembic.zzzcomputing.com/en/latest/tutorial.html

http://www.codeweblog.com/%E5%B8%B8%E8%A7%81%E7%9A%84sqlalchemy%E5%88%97%E7%B1%BB%E5%9E%8B-%E9%85%8D%E7%BD%AE%E9%80%89%E9%A1%B9%E5%92%8C%E5%85%B3%E7%B3%BB%E9%80%89%E9%A1%B9/

http://blog.csdn.net/wenxuansoft/article/details/50242957

 


免責聲明!

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



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