您好,登錄后才能下訂單哦!
我們在使用Django創建工程的時候都使用makemigrations、migrate來生成最初的數據庫模型,但是到最后都是直接在數據庫中手動創建表,為什么呢?因為這些數據庫遷移命令經常會顯示No changes detected,明明我們已經改了數據庫模型了,為什么提示沒有變化呢?這里我們就要搞清楚,數據庫遷移命令是怎么去識別模型變化的。詳細的源碼分析我這里就不做介紹了,說一下它的流程幫助你理解就可以了。
首先我們要知道,與數據庫遷移相關的東西都有哪些?
makemigrations
執行makemigrations命令的時候,執行流程如下:
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)), ], ), ]
3 . 再根據models.py文件中的類生成數據庫表模型
4 . 對比2、3中生成的模型字段,如果有變化就在對應APP的migrations目錄下生成新的.py文件
migrate
執行migrate命令的時候,執行流程如下:
4 . 檢測表中所記錄的數據模型加載的遷移文件與實際migrations目錄下的文件是否相匹配,如果全都加載過,則不執行;如果有未加載的,就執行數據庫命令
結論
通過以上分析得出以下結論:
番外:
網上有人提供了一種方式,執行makemigrations --empty appname,強制生成空的數據庫遷移文件,這樣在執行migrate命令的時候,新生成的遷移文件在django_migrations表中沒有記錄,就不會顯示No changes detected。但是這個空文件中什么都沒做,所以你在models.py中作出的修改并沒有生效。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。