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

#牛客AI配图神器#

全部评论

相关推荐

gelmanspar...:奖学金删掉,自我评价删掉,简历压缩一下,写一页
如果再来一次,你还会学机...
点赞 评论 收藏
分享
故事和酒66:假设一下,就算报了培训班,不还是要投简历,只是项目改了。那不如先写几个培训班的项目,纯靠编,然后试试有没有面试。如果真有再报也不迟,如果没有还是没有,那就不是培训班的问题了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务