前言
隨着項目業務需求的不斷變更,數據庫的表結構修改難以避免,此時就需要對數據庫的修改加以記錄和控制,便於項目的版本管理和隨意的升級和降級。
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://blog.csdn.net/wenxuansoft/article/details/50242957
