![Django 3.0入门与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/246/36862246/b_36862246.jpg)
4.18 迁移
Django通过迁移命令将Model中的任何修改写入到数据库中,例如增加新模型、修改已有模型字段等。
4.18.1 makemigrations
作用:根据模型的变化生成对应的迁移代码,该代码用于更新数据库。
语法:django-admin makemigrations [app_label [app_label ...]]
如果没有填写任何参数,Django会检查所有应用程序中的模型并生成迁移脚本,脚本存放在每个应用下面一个叫作migrations的文件夹下,脚本名字类似0001_initial.py格式。
示例1:为一个应用程序生成迁移。输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P54_26626.jpg?sign=1738820190-rwvYaZdxVTrXI5da6ISjhW88R5t2ESwQ-0-d693d8b7c8b0126b0c47a28c627b1a45)
示例2:生成一个空迁移,高级开发人员可以在空迁移中编写代码。输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P54_26629.jpg?sign=1738820190-olfHqsh2bvXCYDvcPqFfiMwVfZuXVeT1-0-c10b5ba59ab263153b958e531b1e04d3)
示例3:生成一个带名称的迁移。输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P54_26632.jpg?sign=1738820190-axSmnBQXSTk039wghOEwmweHojEg4vi3-0-733da0419ca27628a9b12a2d5dfe0b4b)
4.18.2 migrate
作用:将模型的最新状态部署到数据库。
语法:django-admin migrate [app_label] [migration_name]
如果执行migrate命令时没有给出任何参数,Django会将系统中所有应用程序模型的更改部署到数据库。
如果执行migrate命令时指定了应用程序名,Django仅将指定的应用程序的模型修改部署到数据库。注意,如果该应用程序的模型与其他应用程序模型之间存在关联,那么其他关联的应用程序模型的修改也可能被部署到数据库。
如果执行migrate命令的同时给出了应用程序名和migration名字,系统将会把数据库恢复到一个该迁移前的版本,该操作常用于回滚错误的数据库变更。
为测试回滚操作,在polls\models.py中新建一个模型,并使用migrate命令将其应用到数据库中。
模型代码如下:
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P54_149360.jpg?sign=1738820190-KMqIH0wpfn9Crxt2LdsIaBo4QWo3yukN-0-4872c38a6a0f6ded80df3e6faeb685e8)
所有migration信息保存在django_migrations数据表中,下图是一段时间内发生的数据迁移操作。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P54_26635.jpg?sign=1738820190-qNAetWGTnaZDYafI5R0mYBKxjj1DiIIG-0-c1163d8181907904b357afa7945a1d9b)
其中,最后一行(0005_rolback)就是前面用于生成测试模型的迁移记录,此时执行下面代码将会撤销本次迁移(0004_empty是0005_rolback的前一次操作):
python manage.py migrate polls 0004_empty
输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P55_27071.jpg?sign=1738820190-4vT87xjLAp4zrgTb9IIrDkQmQnfvBpxc-0-ec965f5834f2a5398cb2bf24eda6d90d)
刷新数据库,可以看到0005_rolback已经被删除了。
如果想撤销所有数据库更改,可以使用zero代替migrationname。
其他可选参数如下。
--fake:对于高级用户,仅仅想设置当前的migration状态,并不需要真正去更新数据库,例如已经手工更新过数据库,此时可以使用fake参数。
python manage.py migrate polls --fake
--database DATABASE:将模型更改应用到指定的数据库,默认情况会更新到settings.py里面的default数据库。
4.18.3 sqlmigrate
作用:输出某一个migrate对应的SQL语句。
语法:django-admin sqlmigrate app_label migration_name
示例:打印出初始化的SQL脚本。输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P55_27076.jpg?sign=1738820190-6QozdxB7uvRrSAqx1JAcTeCQlS0s7qF8-0-42d4f7cca42ec61bc8d7ef8f25454a31)
4.18.4 showmigrations
作用:显示migrations记录。
语法:django-admin showmigrations [app_label [app_label ...]]
可以通过--list或者--plan参数设置显示格式。--list按照应用程序显示migration记录,该参数缩写为-l,--plan显示所有记录,缩写为-p。如果某一次migration已经被部署到数据库中,在该记录前就会显示[X],否则显示[ ]。
示例:输入命令,如下图所示。
![](https://epubservercos.yuewen.com/B89DD0/19549641008916106/epubprivate/OEBPS/Images/Figure-P56_27510.jpg?sign=1738820190-4muf4g4rfGbKOGTtQVVAc8A1DysgdZCO-0-d235f73d65b12bbe35d1a750852a5f0b)