Django遷移之migrate問(wèn)題:table xx already exist
前面我們說(shuō)到了makemigrations是將models.py里的模型生成一個(gè)遷移腳本【也就是migration文件】银受,下一步則是通過(guò)migrate命令來(lái)在數(shù)據(jù)庫(kù)中生成表,這個(gè)步驟中往往也會(huì)遇到大大小小的問(wèn)題首启。
一还棱、migrate命令原理
1.1 執(zhí)行的操作
要解決問(wèn)題,需要知道命令到底執(zhí)行了些什么操作:
- migrate 將相關(guān)的遷移腳本翻譯成SQL語(yǔ)句徽千,然后在數(shù)據(jù)庫(kù)中執(zhí)行該語(yǔ)句
- 若該SQL語(yǔ)句執(zhí)行沒(méi)有問(wèn)題苫费,那么就會(huì)將這個(gè)遷移腳本的名字記錄到django_migrations表中
1.2 判斷執(zhí)行條件
那么如何判斷哪些遷移腳本要執(zhí)行呢?
migrate會(huì)將代碼中的遷移腳本和數(shù)據(jù)庫(kù)中的django_migrations 中的遷移腳本進(jìn)行對(duì)比双抽,如果發(fā)現(xiàn)數(shù)據(jù)庫(kù)中百框,沒(méi)有這個(gè)遷移腳本,那么就會(huì)執(zhí)行這個(gè)遷移腳本牍汹。
二铐维、migrate命令報(bào)錯(cuò)原理
原因:數(shù)據(jù)庫(kù)的django_migrations 表中的遷移版本記錄和代碼中的遷移腳本不一致導(dǎo)致的。
常見(jiàn)錯(cuò)誤示例:
table xx already exist
三慎菲、 解決方法
1嫁蛇、方法1: --fake參數(shù)
這一個(gè)參數(shù)是用于,將已經(jīng)創(chuàng)立的表的遷移操作隱藏露该,即將代碼中的遷移腳本添加到django_migrations中睬棚,但并不執(zhí)行SQL語(yǔ)句,避免每次執(zhí)行migrate的時(shí)候解幼,都執(zhí)行一些重復(fù)的遷移腳本抑党。
python manage.py migrate app_name --fake
再正常執(zhí)行遷移映射操作即可
2、方法2: 簡(jiǎn)單粗暴法
這一步如其名一樣簡(jiǎn)單撵摆,刪除了所有相關(guān)遷移腳本和遷移記錄后底靠,重新完全遷移。Lɑ恪?凉恰!需要保持?jǐn)?shù)據(jù)庫(kù)和模型字段一致9赌拧Q髦ァ!
刪除migration文件夾下牵素,除____pycache____和____init____之外的所有文件【即遷移腳本】严衬。
-
刪除數(shù)據(jù)庫(kù)中,相關(guān)字段的所有信息
delete from django_migrations where app = app_name
-
重新執(zhí)行遷移操作
python manage.py makemigrations python manage.py migrate