SQLalchemy 版本遷移工具 alembic 使用

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í)別
    需要注意
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,203評(píng)論 3 119
  • SQLAlchemy是python的一個(gè)數(shù)據(jù)庫(kù)ORM工具,提供了強(qiáng)大的對(duì)象模型間的轉(zhuǎn)換,可以滿足絕大多數(shù)數(shù)據(jù)庫(kù)操作...
    bomo閱讀 3,027評(píng)論 2 5
  • 3月22日15:16 剛剛跟朋友說(shuō)完一些不開(kāi)心的事,突然覺(jué)得我們就像兩只困獸,掙脫不開(kāi)囚牢,身心疲憊,只等著外面眾...
    亦容閱讀 127評(píng)論 0 0
  • 自被追殺起,到今天已經(jīng)3天了,擺脫追殺者有2日了。 已經(jīng)精疲力竭的蕭若蘭,依舊倔強(qiáng)的一瘸一拐的咬著牙,蹣跚的在鄉(xiāng)野...
    蕭蕭秋雨閱讀 1,148評(píng)論 34 29

友情鏈接更多精彩內(nèi)容