前言
在使用ORM建表的時候,由於需要對數據庫表的重新設計,需要刪除原表,並通過Django的ORM功能重新同步表。
刪除表之后,發現用 makemigrations 和 migrate 無法生成新的表了。
遇到問題
當我新建一個 Model ,同步完數據庫后,再修改里面的字段名稱,發現無法同步到數據庫,於是就把數據庫里面的整張表刪除了。
結果再同步數據庫就無法生成新的表了,就算刪除 migrations 目錄下的0001_initial.py文件也一樣。
# 新建了一個PersonIn類,繼承自models.Model,
class PersonIn(models.Model):
uid = models.IntegerField(primary_key=True)
name = models.CharField(max_length=30)
agex = models.IntegerField()
刪除 migrations 目錄下的0001_initial.py文件
執行 makemigrations 和 migrate 無法生成新的表了
D:\soft\MyDjango>python manage.py makemigrations
Migrations for 'yoyo':
yoyo\migrations\0001_initial.py
- Create model PersonIn
D:\soft\MyDjango>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, yoyo
Running migrations:
No migrations to apply.
D:\soft\MyDjango>
結果沒生成新的表
解決辦法1
如果刪除后,無法自動生成,首先想到的解決辦法,可以先查詢到建表的sql,自己去執行sql建表
python manage.py sqlmigrate your_app_name 0001
cmd執行上面的命令,your_app_name 換成自己的 app 名稱
D:\soft\MyDjango>python manage.py sqlmigrate yoyo 0001
BEGIN;
--
-- Create model PersonIn
--
CREATE TABLE `yoyo_personin` (`uid` integer NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `agex` integer NOT NULL);
COMMIT;
於是得到建表的SQL,去數據庫執行下就可以了
解決辦法2
上面的辦法只能從表面上解決問題,不能解決根本問題,根本的原因是因為在 django_migrations 表里面已經生成表記錄了。
執行 SQL 刪除app相關的記錄
delete from django_migrations where app=' your_app_name'
執行完成后,再執行makemigrations 和 migrate就可以同步成功了
D:\soft\MyDjango>python manage.py makemigrations
No changes detected
D:\soft\MyDjango>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, yoyo
Running migrations:
Applying yoyo.0001_initial... OK
看到 OK 說明成功了