Django Migrations

我们已经开始运行了一个简单的Django应用,你会注意到为了构建应用数据库,我们使用了命令 python manage.py migrate

Migrations概念

所谓 Migrations 是指Django将models的修改(添加字段、删除模型)转换到数据库schema(模式)的方法。migrate通常设计是自动的,但是你需要如何创建migrations,何时需要运行migrate,以及出现问题时如何解决。

migrations流程

  • 构建 model

在Django中,我们不需要手工去创建数据库,而是先构建一个 model ,即在 models.py 中我们定义数据库结构

 1from django.db import models
 2
 3class User(models.Model):
 4    username = models.CharField(max_length=19)
 5    email = models.CharField(max_length=100)
 6    groups = models.CharField(max_length=100)
 7    create_time = models.DateTimeField()
 8
 9    class Meta:
10        ordering = ('create_time',)
  • 然后我们执行 makemigrations 创建对应的数据库initial.py:

    python manage.py makemigrations
    

此时会自动在 migrations 目录下生成生成一个 0001_initial.py 文件,类似

 1from django.db import migrations, models
 2
 3
 4class Migration(migrations.Migration):
 5
 6    initial = True
 7
 8    dependencies = [
 9    ]
10
11    operations = [
12        migrations.CreateModel(
13            name='GuestPanic',
14            fields=[
15                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
16                ('username', models.CharField(max_length=19)),
17                ('email', models.CharField(max_length=100)),
18                ('gruops', models.CharField(max_length=100)),
19                ('create_time', models.DateTimeField()),
20            ],
21            options={
22                'ordering': ('create_time',),
23            },
24        ),
25    ]
  • 执行数据库操作:

    python manage.py migrate
    

这个命令会根据生成的 0001_initial.py 对数据库进行操作,创建表格和对应字段。

  • 检查项目的migrations以及状态:

    python manage.py showmigrations
    

这个命令会输出所有的migrations以及状态(是否执行过)

Migrations后端支持

Migrations屏蔽了Django使用的数据库后端差异,通过完全相同的 model ,我们可以配置不同的数据库后端,实现对不同数据库的schema构建和修改。

清空数据和重新migrations同步

在开发过程中,我们可能会需要清空数据库并重新migrate,步骤如下

  • 删除项目的数据库表,这里举例是 api 项目(如果要保留数据,可以不执行这步)

  • 删除项目的migrations目录下所有文件,但保留 __init__.py

  • 重建migrate初始化文件:

    python manage.py makemigrations
    
  • 检查migrate状态(这里 api 是项目名字):

    python manage.py showmigrations api
    
  • 因为之前已经执行过migrate命令,所以同名的migrate都是已经执行状态,我们需要重置成空的状态:

    python manage.py migrate --fake api zero
    

然后再次检查migrate状态就会看到 api 对应的migrate状态是空的:

python manage.py showmigrations api
  • 重新生成migrate文件:

    python manage.py makemigrations api
    

此时重新生成的 0001_initial.py 文件会反映修订过的 models.py 内容(假如你调整了数据库表结构)

  • 重新执行数据库同步:

    python manage.py migrate
    

备注

如果你只想重新生成migrate文件,但是不执行到数据库,则使用:

python manage.py --fake-initial api

参考