1. 程式人生 > 其它 >常見問題處理 - migrate檔案遷移錯誤

常見問題處理 - migrate檔案遷移錯誤

處理1:當執行 pythonmanage.pymakemigrations 出現如下遷移錯誤時的處理方法

對應中文:

您試圖新增一個沒有預設值的非空欄位'des';我們不能這樣做(資料庫需要填充現有行)

請選擇如下方案:

  1. 現在提供一次性預設值(將對所有現有行設定此列的空值)。
  2. 退出,在models.py中新增一個預設值。

錯誤原因:

  • 當對模型類新新增一個欄位時可出現該錯誤
  • 原理是 新增新欄位後,資料庫不知道原來已有資料對於新建欄位該如何賦值,所以新增欄位時,務必要新增default預設值。

處理方法:

  • 選擇1 則會進入shell中,手動輸入一個預設值。
    • 但是當你選擇了1,添加了預設值,在models.py裡不會有體現。
  • 選擇2 退出當前生成遷移檔案的過程,自己去修改models.py,新增加一個'default=xxx'的預設值(推薦使用)

處理2:資料庫的遷移檔案混亂的解決方法

  • 資料庫中django_migrations表記錄了migrate的'全過程',專案各應用中的migrate檔案應與之對應,否則migrate會報錯
  • 檢視django_migrations表可以看到所有增刪改查記錄:
select * from django_migrations\G;

在多人合作一個專案的時候,可能會遇到我的記錄已經是005了,另一個人的可能才003。理論上來說,migrations檔案裡的遷移檔案是不讓提交的,但是往往新手會遇到這樣的問題,意外地提交上去了。比如我更新到了別人的migrations檔案,和我原來的檔案不一樣,跟我本地測試庫裡的執行記錄就更對不上了。可能我更完別人的我的migrations檔案裡就只剩0001了,但是我本地的資料庫裡面都執行到0005了,很顯然這完全對不上。

最終解決辦法就是未來大家都不要提交自己的migrations資料夾裡的檔案,每個人的遷移檔案自己留著。但是如果已經遇到這種檔案怎麼辦:

  • 解決方案:
    • 1、刪除 所有migrations裡所有的000?_XXXX.py ( __ init __ .py除外)
    • 2、刪除 資料庫
      • mysql>drop database mywebdb;
    • 3、重新建立 資料庫
      • mysql>create databases mywebdb default charset ...;
    • 4、重新生成migrations裡所有的000?_XXXX.py
      • pythonmanage.pymakemigrations
    • 5、重新更新資料庫
      • pythonmanage.pymigrate