創建和部署flask中有關migrate可能遇到的問題

這篇文章是jtr_109發在cocode中的一篇帖子,感覺看後挺有收穫並且以後可能會用到所以轉過來了,他的git是https://github.com/jtr109
我自己在創建完遷移腳本後(可參考我另一篇關於flask-migrate的文章)執行python manage.py db upgrade進行更新時,發現只出現
(base) C:\Users\kai\PycharmProjects\practice\myflasky>python manage.py db upgrade
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
的字樣,並沒有真正創建成功,而輸入python manage.py db migrate的話,又會出現
(base) C:\Users\kai\PycharmProjects\practice\myflasky>python manage.py migrate
usage: manage.py [-?] {runserver,shell,db,test} ...
manage.py: error: invalid choice: 'migrate' (choose from 'runserver', 'shell', 'db', 'test')
的提醒,後來參考jtr_109下面的帖子的經驗,我意識到之後每次更新數據庫應該都是要先migrate再upgrade的,而且要給更新的腳本署名,就類似於先更新腳本,flask纔會根據新的腳本數據再去更新數據庫相應模型。所以我就嘗試輸入
python manage.py db migrate -m "add user profile"
顯示的成功了.
注:之後還需要輸入python manage.py db upgrade完成遷移

下面是jtr_109的原文:
  1. 影響 migrate 的是數據庫的結構。

    • 比方說你的 User 類中添加了一個 Column - nickname ,那麼在保存 Model 之後建議執行 python manage.py db migrate -m "add nickname
    • 而給 table 加入了新的方法,例如 def change_nick_name() ,是不需要 migrate 的。如果 migrate,結果也是 No change
    • 這一點可以留意一下,比較保險的辦法是覺得有必要的時候就嘗試一下 migrate,反正 No changes 對你的遷移也沒有影響。
  2. 在創建本地數據庫的時候,不要在 py shell 環境下執行 db.create_all()

    • 請使用python manage.py db initpython manage.py db upgrade 來創建本地數據庫。
    • 通常我會模仿書本上在上面兩條指令之間再做一次migrate,但經驗告訴我,結果好像都是No changes,畢竟,我init之後沒有做過調整啊。
    • init指令會根據Model.py中的結構創建遷移文件夾migrations,而upgrade會根據migrations下的內容,通過config.py在找到正確的位置,並創建SQL,並在SQL中創建一個名爲versions的table來存放和遷移文件夾中相同的版本號。(重要
    • 在開始的嘗試中,特別是往heroku上部署的過程中,經常會遇到許多數據庫的坑,如果實在走投無路,又確定是數據庫遷移問題,並且無法優雅地解決。你需要做的就是以下幾步:
      (1). 休息一下,我知道你很累了
      (2). 執行python manage.py db shell,在py shell環境下執行drop_all();或者直接刪了你的原有數據庫。
      (3). 按照本段前面的提示重新創建本地SQL
      (4). drop_all()或者刪除並重新指定遠端數據庫
      (5). 執行heroku run python manage.py db deploy(假設你部署在heroku上,並已經完成了deploy的定義)
      (6). 現在你的遠端和本地數據庫的版本是相同的了。
  3. 如果本地使用sqlite作爲數據庫,千萬不要從model.py中刪除column

    • 這一點非常重要,因爲根據我查到到資料顯示,sqlite是沒有“刪除行”這一個選項的。如果你刪除了某個column,這一操作能被migrate正確記錄,但是在你upgrade的時候就會報錯。然後想要還原migrate版本?抱歉,我不會……(歡迎朋友們指導一下,謝謝!)
  4. 部署到遠端時,請確認你又versions文件夾

    • 我不確定init會不會有,在執行migrate指令時,會更新versions文件夾
    • 如果沒有versions文件夾,遠端部署的時候也會報錯,請務必留意。
  5. 理解每個遷移指令的含義

    • init的作用是初始化遷移,創建migration文件夾
    • migrate的作用是根據model.py中的變化更新遷移,該指令會在migration/versions/文件夾中新增一個版本文件,文件名爲版本號。打開能夠看到對應model.py文件,修改前後新遷移版本發生的變化。
    • update會將遷移中最新版本的結構應用到數據庫中(例如添加新增的列),並更新自動創建的version表中的版本號。該版本號與migration/versions/文件夾中對應。任何情況下,這兩個版本號不對應都會導致出錯。

我的帖子與回答都會持續更新。如果您覺得有幫助,煩請點個贊,這樣或許能幫到其它朋友。

如果我有誤導他人的地方,請與我聯繫,我會及時修改。謝謝!

如果有需要的朋友,可以看看我的website,希望對大家有所幫助。

關於網頁中已有的功能都可以和我交流,歡迎查找bug,交流心得。謝謝!

jtr-todo.herokuapp.com1

(網站處於測試階段,請勿保存重要信息,數據丟失概不負責,還請見諒。)

辭職學習中,有工作機會歡迎與我聯繫,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章