1. 報錯問題
python manage.py makemigrations
遷移命令後報錯No changes detected
2. 問題分析
數據庫遷移命令是怎麼去識別模型變化的?
- models.py中定義的模型
- APP下面的migrations目錄
- 數據庫中的django_migrations表
1) makemigrations
執行makemigrations命令的時候,執行流程如下:
- 根據註冊的APP,獲取所有APP下的migrations目錄,遍歷其下的py文件(不以_~開頭的)
- 然後根據文件中的內容生成對應的數據庫表模型
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)),
],
),
]
- 再根據models.py文件中的類生成數據庫表模型
- 對比2、3中生成的模型字段,如果有變化就在對應APP的migrations目錄下生成新的.py文件
2)migrate
執行migrate命令的時候,執行流程如下:
- 根據註冊的APP,獲取所有APP下的migrations目錄,遍歷其下的py文件(不以_~開頭的)
- 根據migrations目錄下的所有遷移文件生成數據庫表模型
- 讀取django_migrations表中的所有記錄,其中記錄的是所有表生成的遷移文件信息
- 檢測表中所記錄的數據模型加載的遷移文件與實際migrations目錄下的文件是否相匹配,如果全都加載過,則不執行;如果有未加載的,就執行數據庫命令
3. 結論
- app下必須有migrations文件夾
- 執行遷移時應該先執行makemigrations,再執行migrate(建議)
- 如果執行命令顯示沒有變化,請對比django_migrations表和migrations目錄下的文件名,是否對應的文件以及執行過遷移
如果想重新執行遷移,例如migrations下有0002_initial.py文件,django_migrations中也包含對應記錄,則刪除django_migrations表中對應記錄,重新執行migrate命令即可 - models.py文件中已設置類