Django数据库迁移全指南
Django 数据库迁移命令详解
Django 的数据库迁移系统是框架的核心功能之一,允许开发者通过 Python 代码管理数据库模式的变更。迁移命令分为两类:生成迁移文件的 makemigrations 和执行迁移的 migrate。
生成迁移文件
使用 makemigrations 命令可以根据模型(Model)的变更生成迁移文件。命令格式如下:
python manage.py makemigrations [app_label]
如果不指定 app_label,Django 会检查所有已安装应用的模型变更。生成的迁移文件位于应用的 migrations 目录中,文件名格式为 NNNN_description.py。
迁移文件包含 Migration 类,定义了 operations 列表,例如:
operations = [
migrations.CreateModel(
name='Author',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
],
),
]
执行迁移
migrate 命令将未应用的迁移同步到数据库:
python manage.py migrate [app_label] [migration_name]
不指定参数时,Django 会应用所有未完成的迁移。指定 migration_name 可以回滚到特定版本,例如:
python manage.py migrate books 0002
迁移状态检查
查看迁移状态和依赖关系:
python manage.py showmigrations
输出示例:
books
[X] 0001_initial
[X] 0002_author
[ ] 0003_publisher
[X] 表示已应用,[ ] 表示未应用。
自定义迁移操作
对于复杂变更,可以手动编写迁移文件。例如数据迁移:
def forwards_func(apps, schema_editor):
Author = apps.get_model('books', 'Author')
Author.objects.create(name='J.K. Rowling')
operations = [
migrations.RunPython(forwards_func),
]
迁移合并冲突解决
当分支合并出现迁移冲突时,使用 --merge 选项:
python manage.py makemigrations --merge
这会创建一个合并迁移文件,解决冲突的依赖关系。
迁移文件优化
检查迁移文件是否存在优化空间:
python manage.py makemigrations --check
如果输出“No changes detected”,说明所有模型变更已完全优化到现有迁移中。
数据库反向迁移
回滚到之前的迁移状态:
python manage.py migrate books 0001
这会取消 0002 及之后的迁移操作。
迁移文件编辑
已生成的迁移文件可以手动编辑,但需确保操作顺序和依赖关系正确。例如修改字段属性:
migrations.AlterField(
model_name='book',
name='title',
field=models.CharField(max_length=200, unique=True),
),
迁移与版本控制
迁移文件应纳入版本控制系统。团队开发时,拉取新分支后应先运行:
python manage.py migrate
确保本地数据库与最新迁移同步。
通过合理使用这些命令,可以高效管理 Django 项目的数据库演变过程,同时保持开发、测试和生产环境的一致性。
BbS.okapop153.sbs/PoSt/1122_070308.HtM
BbS.okapop154.sbs/PoSt/1122_392196.HtM
BbS.okapop155.sbs/PoSt/1122_769956.HtM
BbS.okapop156.sbs/PoSt/1122_693484.HtM
BbS.okapop157.sbs/PoSt/1122_882502.HtM
BbS.okapop158.sbs/PoSt/1122_843340.HtM
BbS.okapop159.sbs/PoSt/1122_292108.HtM
BbS.okapop160.sbs/PoSt/1122_842601.HtM
BbS.okapop161.sbs/PoSt/1122_650742.HtM
BbS.okapop162.sbs/PoSt/1122_726720.HtM
BbS.okapop153.sbs/PoSt/1122_325672.HtM
BbS.okapop154.sbs/PoSt/1122_013130.HtM
BbS.okapop155.sbs/PoSt/1122_996938.HtM
BbS.okapop156.sbs/PoSt/1122_640139.HtM
BbS.okapop157.sbs/PoSt/1122_395628.HtM
BbS.okapop158.sbs/PoSt/1122_329747.HtM
BbS.okapop159.sbs/PoSt/1122_193057.HtM
BbS.okapop160.sbs/PoSt/1122_952520.HtM
BbS.okapop161.sbs/PoSt/1122_313651.HtM
BbS.okapop162.sbs/PoSt/1122_675980.HtM
BbS.okapop153.sbs/PoSt/1122_205588.HtM
BbS.okapop154.sbs/PoSt/1122_762031.HtM
BbS.okapop155.sbs/PoSt/1122_068407.HtM
BbS.okapop156.sbs/PoSt/1122_502037.HtM
BbS.okapop157.sbs/PoSt/1122_562713.HtM
BbS.okapop158.sbs/PoSt/1122_270590.HtM
BbS.okapop159.sbs/PoSt/1122_471300.HtM
BbS.okapop160.sbs/PoSt/1122_123585.HtM
BbS.okapop161.sbs/PoSt/1122_747704.HtM
BbS.okapop162.sbs/PoSt/1122_078342.HtM
BbS.okapop153.sbs/PoSt/1122_344316.HtM
BbS.okapop154.sbs/PoSt/1122_866670.HtM
BbS.okapop155.sbs/PoSt/1122_360480.HtM
BbS.okapop156.sbs/PoSt/1122_529390.HtM
BbS.okapop157.sbs/PoSt/1122_459076.HtM
BbS.okapop158.sbs/PoSt/1122_429396.HtM
BbS.okapop159.sbs/PoSt/1122_658982.HtM
BbS.okapop160.sbs/PoSt/1122_993433.HtM
BbS.okapop161.sbs/PoSt/1122_687524.HtM
BbS.okapop162.sbs/PoSt/1122_624090.HtM
BbS.okapop153.sbs/PoSt/1122_342201.HtM
BbS.okapop154.sbs/PoSt/1122_112929.HtM
BbS.okapop155.sbs/PoSt/1122_460864.HtM
BbS.okapop156.sbs/PoSt/1122_245380.HtM
BbS.okapop157.sbs/PoSt/1122_508443.HtM
BbS.okapop158.sbs/PoSt/1122_430047.HtM
BbS.okapop159.sbs/PoSt/1122_982215.HtM
BbS.okapop160.sbs/PoSt/1122_976512.HtM
BbS.okapop161.sbs/PoSt/1122_576251.HtM
BbS.okapop162.sbs/PoSt/1122_333967.HtM
BbS.okapop153.sbs/PoSt/1122_730785.HtM
BbS.okapop154.sbs/PoSt/1122_135128.HtM
BbS.okapop155.sbs/PoSt/1122_053258.HtM
BbS.okapop156.sbs/PoSt/1122_295787.HtM
BbS.okapop157.sbs/PoSt/1122_513974.HtM
BbS.okapop158.sbs/PoSt/1122_314431.HtM
BbS.okapop159.sbs/PoSt/1122_249008.HtM
BbS.okapop160.sbs/PoSt/1122_613272.HtM
BbS.okapop161.sbs/PoSt/1122_278121.HtM
BbS.okapop162.sbs/PoSt/1122_019050.HtM
BbS.okapop153.sbs/PoSt/1122_317137.HtM
BbS.okapop154.sbs/PoSt/1122_352286.HtM
BbS.okapop155.sbs/PoSt/1122_082282.HtM
BbS.okapop156.sbs/PoSt/1122_603257.HtM
BbS.okapop157.sbs/PoSt/1122_268614.HtM
BbS.okapop158.sbs/PoSt/1122_567875.HtM
BbS.okapop159.sbs/PoSt/1122_814160.HtM
BbS.okapop160.sbs/PoSt/1122_231329.HtM
BbS.okapop161.sbs/PoSt/1122_808284.HtM
BbS.okapop162.sbs/PoSt/1122_610518.HtM
BbS.okapop153.sbs/PoSt/1122_802711.HtM
BbS.okapop154.sbs/PoSt/1122_451563.HtM
BbS.okapop155.sbs/PoSt/1122_302570.HtM
BbS.okapop156.sbs/PoSt/1122_583078.HtM
BbS.okapop157.sbs/PoSt/1122_698843.HtM
BbS.okapop158.sbs/PoSt/1122_465809.HtM
BbS.okapop159.sbs/PoSt/1122_596196.HtM
BbS.okapop160.sbs/PoSt/1122_191184.HtM
BbS.okapop161.sbs/PoSt/1122_822153.HtM
BbS.okapop162.sbs/PoSt/1122_281635.HtM
