alembic_SQLAlchemy的遷移工具
簡介
alembic是SQLAlchemy作者編寫的控制 model 版本的模組,配合SQLAlchemy使用更佳, alembic的用法有點類似於git, 可以理解為ORM與資料庫的版本管理工具
安裝
在專案的虛擬環境中安裝
pip install alembic
初始化
# 進入專案目錄
cd yourproject
# 執行初始化命令
alembic init alembic
初始化後, 會在專案目錄中新增一個alembic資料夾和alembic.ini檔案
修改 alembic.ini
alembic.ini檔案是alembic的配置檔案, 具體每個配置項的含義可以檢視官方文件:
這裡我們只需要修改sqlalchemy.url
這一項即可, 把SQLAlchemy
中建立engine
的資料庫連線複製進來即可:
sqlalchemy.url = mysql+pymysql://root:[email protected]/cy_account
注: 這裡的驅動不能使用aiomysql
, 若使用了則會報錯
建立模型類
在models
資料夾下建立檔案base_model.py
from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'user' user_id = Column(Integer, primary_key=True) user_name = Column(String(20))
修改alembic的env.py
修改target_metadata
這一項, 把原來的None
改為上面模型類使用Base.metadata
# 官方註釋 # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata # 預設配置 # target_metadata = None # 修改後配置 from models import base_model target_metadata = base_model.Base.metadata
修改這一項的作用是把模型類和alembic關聯起來, 這樣alembic就可以檢測到模型類的修改, 並自動生成對應的修改sql語句
進行遷移(後續修改模型類後也都需要遷移)
生成遷移檔案
alembic revision --autogenerate -m 'init'
可以在下方的列印結果中, 看到檢測到了新增表user
# 列印結果
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'user'
Generating /mnt/d/study/python/projects/cy_account/alembic/versions/22456fa02b62_init.py ... done
同時在alembic
目錄下的versions
中新增了一個檔案22456fa02b62_init.py
, 這就是生成的遷移檔案, 可以理解為對應的建表sql
也可以把這條命令理解為git的commit命令, 只是在本地生成了一個版本, 那麼還需要push到遠端才能完成提交
提交至資料庫
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 -> 22456fa02b62, init
執行完成後, 再去資料庫檢視可以看到新添加了兩張表, 一張alembic_version
是alembic用來做版本控制的, 另一張則是我們的模型了類對應的表user
多個模型類檔案時
修改模型類檔案
上面我們只建立了一個模型類檔案base_model
, 在裡面定義了user
表, 如果我們專案比較大, 有多個模組, 想把每個模組的模型類都定義在不同的py檔案中, 如這裡有使用者模組和訂單模組, 分別對應使用者模型類users.py
和 orders.py
# users.py, 把上面base_model中定義User移動到這裡定義from sqlalchemy import Column, Integer, Stringfrom models.base_model import Baseclass User(Base): __tablename__ = 'user' user_id = Column(Integer, primary_key=True) user_name = Column(String(20))
# orders.pyfrom sqlalchemy import Column, Integer, Stringfrom models.base_model import Baseclass Order(Base): __tablename__ = 'order' order_id = Column(Integer, primary_key=True) order_num = Column(String(20))
同時還需要在base_model.py
中匯入上面定義的兩個模型類檔案才行, 否則alembic檢測不到模型類
# base_model.pyfrom sqlalchemy.orm import declarative_baseBase = declarative_base()# 注意先建立Base, 再匯入模型類檔案from models import usersfrom models import orders
進行遷移
# 生成遷移檔案alembic revision --autogenerate -m 'xxxx'# 提交至資料庫alembic upgrade head