SQLAlchemy是python里的處理模ORM(模型關(guān)系映射)一套工具,可以通過(guò)直觀地通過(guò)定義python中的class來(lái)定義數(shù)據(jù)表結(jié)構(gòu),通過(guò)操作class的具體object來(lái)操作數(shù)據(jù)記錄。 Alembic是一套管理數(shù)據(jù)庫(kù)升降級(jí)的遷移工具,比如在實(shí)際業(yè)務(wù)場(chǎng)景中需要對(duì)已經(jīng)定義好的模型進(jìn)行增刪字段操作,可以通過(guò)alembic來(lái)對(duì)升降級(jí)進(jìn)行方便地可控地操作。
安裝用到的包
pip install pymysql
pip install sqlalchemy
pip install alembic
alembic 初始化和配置
完成 pip 安裝之后
- 在 shell 里面 cd 到項(xiàng)目的根目錄執(zhí)行
alembic init alembic (初始化完成后,會(huì)生成一個(gè)alembic.ini配置文件及一個(gè)alembic目錄) -
用 pycharm 新建一個(gè)文件夾alembic,把生成的文件 download 回來(lái)(包括 alembic 目錄和 alembic.ini)
image.png - 修改 alembic.ini 設(shè)置數(shù)據(jù)庫(kù)連接。
sqlalchemy.url = driver://user:pass@localhost/dbname
image.png -
在 env.py 中設(shè)置,將target_metadata賦值成數(shù)據(jù)庫(kù)的元數(shù)據(jù)(metadata)
如果執(zhí)行 revision 有 import 報(bào)錯(cuò),注意是否正確將當(dāng)前項(xiàng)目目錄添加到 sys.path 路徑
image.png
基于數(shù)據(jù)庫(kù) model 定義進(jìn)行更新
將 model 定義好,并確認(rèn)在 env.py 里導(dǎo)入的 Base 類是在 model 定義的地方的
-
配置完成執(zhí)行( -m "注釋信息",根據(jù)情況更改,會(huì)用到生成的py文件名字里)
alembic revision --autogenerate -m "create_user_table"
這里可以看到虛擬機(jī)目錄在 alembic/versions 里生成了 py 文件,
image.png
檢查確認(rèn)更新的內(nèi)容,然后執(zhí)行
alembic upgrade head
這樣就會(huì)更新 mysql 數(shù)據(jù)庫(kù)了
命令參考
查看記錄和歷史
- alembic history
查看生成的 py 文件
- ls -l alembic/versions
其他操作
- 刪除 alembic/versions/xxx.py
常見(jiàn)問(wèn)題
- 執(zhí)行 alembic 報(bào)錯(cuò),KeyError:'5b29018b55ba'
原因:該版本曾經(jīng)upgrade執(zhí)行過(guò)了,但是文件被刪除,
解決辦法:更新是數(shù)據(jù)庫(kù) alembic_version 表記錄
ERROR [alembic.util.messaging] Can't locate revision identified by 'a2de455a4f51' FAILED: Can't locate revision identified by 'a2de455a4f51' - 執(zhí)行 alembic autogenerate 沒(méi)有看到數(shù)據(jù)庫(kù)更新
原因:Base import 不正確,或者 model 定義不正確
解決辦法:檢查 model 代碼
數(shù)據(jù)庫(kù)還沒(méi)有執(zhí)行 upgrade head 更新,不能執(zhí)行 autog
ERROR [alembic.util.messaging] Target database is not up to date. FAILED: Target database is not up to date.
刪除所有 py 文件之后的重新開(kāi)始,最好把數(shù)據(jù)庫(kù)的表也刪除完
這樣才能確保生成的py文件反應(yīng)所有數(shù)據(jù)庫(kù)變更
單獨(dú)更改列名或一些列屬性和表名等不能自動(dòng)識(shí)別
需要注意



