Django 3.0入门与实践
上QQ阅读APP看书,第一时间看更新

4.18 迁移

Django通过迁移命令将Model中的任何修改写入到数据库中,例如增加新模型、修改已有模型字段等。

4.18.1 makemigrations

作用:根据模型的变化生成对应的迁移代码,该代码用于更新数据库。

语法:django-admin makemigrations [app_label [app_label ...]]

如果没有填写任何参数,Django会检查所有应用程序中的模型并生成迁移脚本,脚本存放在每个应用下面一个叫作migrations的文件夹下,脚本名字类似0001_initial.py格式。

示例1:为一个应用程序生成迁移。输入命令,如下图所示。

示例2:生成一个空迁移,高级开发人员可以在空迁移中编写代码。输入命令,如下图所示。

示例3:生成一个带名称的迁移。输入命令,如下图所示。

4.18.2 migrate

作用:将模型的最新状态部署到数据库。

语法:django-admin migrate [app_label] [migration_name]

如果执行migrate命令时没有给出任何参数,Django会将系统中所有应用程序模型的更改部署到数据库。

如果执行migrate命令时指定了应用程序名,Django仅将指定的应用程序的模型修改部署到数据库。注意,如果该应用程序的模型与其他应用程序模型之间存在关联,那么其他关联的应用程序模型的修改也可能被部署到数据库。

如果执行migrate命令的同时给出了应用程序名和migration名字,系统将会把数据库恢复到一个该迁移前的版本,该操作常用于回滚错误的数据库变更。

为测试回滚操作,在polls\models.py中新建一个模型,并使用migrate命令将其应用到数据库中。

模型代码如下:

所有migration信息保存在django_migrations数据表中,下图是一段时间内发生的数据迁移操作。

其中,最后一行(0005_rolback)就是前面用于生成测试模型的迁移记录,此时执行下面代码将会撤销本次迁移(0004_empty是0005_rolback的前一次操作):

    python manage.py migrate polls 0004_empty

输入命令,如下图所示。

刷新数据库,可以看到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脚本。输入命令,如下图所示。

4.18.4 showmigrations

作用:显示migrations记录。

语法:django-admin showmigrations [app_label [app_label ...]]

可以通过--list或者--plan参数设置显示格式。--list按照应用程序显示migration记录,该参数缩写为-l,--plan显示所有记录,缩写为-p。如果某一次migration已经被部署到数据库中,在该记录前就会显示[X],否则显示[ ]。

示例:输入命令,如下图所示。