Django makemigrations/migrate遷移報錯問題

1. 報錯問題

python manage.py makemigrations

遷移命令後報錯No changes detected

2. 問題分析

數據庫遷移命令是怎麼去識別模型變化的?

  • models.py中定義的模型
  • APP下面的migrations目錄
  • 數據庫中的django_migrations表

1) makemigrations

執行makemigrations命令的時候,執行流程如下:

  1. 根據註冊的APP,獲取所有APP下的migrations目錄,遍歷其下的py文件(不以_~開頭的)
  2. 然後根據文件中的內容生成對應的數據庫表模型
class Migration(migrations.Migration):
 initial = True
 dependencies = [
 ]
 operations = [
 migrations.CreateModel(
 name='Course',
 fields=[
 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 ('title', models.CharField(max_length=64)),
 ],
 ),
 ]
  1. 再根據models.py文件中的類生成數據庫表模型
  2. 對比2、3中生成的模型字段,如果有變化就在對應APP的migrations目錄下生成新的.py文件

2)migrate

執行migrate命令的時候,執行流程如下:

  1. 根據註冊的APP,獲取所有APP下的migrations目錄,遍歷其下的py文件(不以_~開頭的)
  2. 根據migrations目錄下的所有遷移文件生成數據庫表模型
  3. 讀取django_migrations表中的所有記錄,其中記錄的是所有表生成的遷移文件信息
  4. 檢測表中所記錄的數據模型加載的遷移文件與實際migrations目錄下的文件是否相匹配,如果全都加載過,則不執行;如果有未加載的,就執行數據庫命令

3. 結論

  1. app下必須有migrations文件夾
  2. 執行遷移時應該先執行makemigrations,再執行migrate(建議)
  3. 如果執行命令顯示沒有變化,請對比django_migrations表和migrations目錄下的文件名,是否對應的文件以及執行過遷移
    如果想重新執行遷移,例如migrations下有0002_initial.py文件,django_migrations中也包含對應記錄,則刪除django_migrations表中對應記錄,重新執行migrate命令即可
  4. models.py文件中已設置類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章