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应用的某次迁移
python manage.py migrate books 0002
撤销某个应用的所有迁移
python manage.py migrate books zero
撤销不是100%能够成功的,有一些已经应用的改变是不可撤销的,那么尝试撤销这种改变会引发
IrreversibleError异常,那么这种情况就需要自行解决了。
参考链接
Django官网-迁移
|