Django makemigrations migrate执行成功但不创建数据库表的解决
作者:Harrytsz
Django makemigrations migrate执行成功不创建数据库表
问题描述
删除 app/migrations/0001_initial.py 文件以后和 MySQL 数据库中对应的 app 表后,执行以下命令成功,但是 MySQL 并不会创建新的 app 表
python manage.py makemigrations python manage.py migrate # 提示:No changes detected
问题原因
在 MySQL 数据库中有一张 django_migrations 表, 这张表里面有创建表的记录,删除对应的数据表记录即可(注意:不用删除整张 django_migrations 表):
在 MySQL 中执行如下命令:
`delete from django_migrations where app='yourappname';`
然后回到 Django 中重新执行:
python manage.py makemigrations appname python manage.py migrate appname
刷新 MySQL 库,即可看到新创建的数据表。
Django迁移的理解(migrate和makemigrations)
makemigrations的作用
当执行 python manage.py makemigrations
命令时,Django会检索项目中models.py文件里的模型类,根据这些模型类来生成一些迁移文件,这些文件会出现在每个应用(app)的migrations文件夹下,里面的文件名会类似于下方这样
- 0001_initial - 0002_some_change - 0003_another_change - 0004_undo_something
每一次执行makemigrations,这些文件前面的编号会根据上一次的编号进行递增。
文件中记录了本次执行makemigrations时,应用(app)下的模型类相较于上一次执行命令(makemigrations)时的区别,如果是第一次执行,那么就会是进行初始化。
这些文件的作用是记录每一次模型类变化的内容,可以将这些迁移文件看作数据库版本控制的记录文件,每一次模型类的增加、修改、删除都记录在这些文件中,这样我们可以将数据库的变化恢复到某次迁移之前的样子。
如果想将开发出来的项目给别人使用时,在别人的电脑上可以根据迁移文件快速构建出和自己开发时同样的数据库表。
migrate的作用
执行 python manage.py migrate
前,一般都需要使用makemigrations生成迁移文件(需要了解模型类有什么变化),然后根据这些迁移文件中的记录的变化内容应用到数据库中,使数据库中的表能够与当前模型类对应。
migrate可以将新的变化应用到数据库中,也可以将上一次的迁移撤销或者还原到某次迁移之前的状态。
这种撤销迁移的效果也可以自己手动来实现,例如直接对迁移文件、模型类、数据库表进行修改,但是django中一个django_migrations表,这个表记录了每个应用(app)每一次的迁移记录,如果手动删除时没有涉及到这个表的修改,那么便会出现一些错误。
撤销book应用的某次迁移
# migrate后面需要写应用名字,0002代表的是迁移文件前面的编号 python manage.py migrate books 0002
撤销某个应用的所有迁移
# 撤销所有迁移时,使用zero来代替迁移文件编号 python manage.py migrate books zero
撤销不是100%能够成功的,有一些已经应用的改变是不可撤销的,那么尝试撤销这种改变会引发
IrreversibleError异常,那么这种情况就需要自行解决了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。