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