1. 程式人生 > 其它 >alembic_SQLAlchemy的遷移工具

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的配置檔案, 具體每個配置項的含義可以檢視官方文件:

教程— Alembic 1.6.0文件 (sqlalchemy.org)

這裡我們只需要修改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.pyorders.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