Django 数据库迁移:makemigrations 与 migrate 命令详解

在 Django 框架中,数据库迁移是管理数据库模式变更的核心机制。makemigrationsmigrate 是两个关键命令,它们协同工作实现数据库结构的版本控制。


1. makemigrations 命令

作用:根据模型(Model)变更生成迁移脚本
本质:将 models.py 的修改转化为可执行的数据库操作指令
流程

python manage.py makemigrations [app_name]

  • 检测模型变化(新增字段、修改约束等)
  • 在应用目录下生成 migrations/000X_*.py 迁移文件
  • 文件内容包含 operations 列表(如 CreateModel, AlterField

示例场景

# models.py 新增字段
class Book(models.Model):
    title = models.CharField(max_length=100)
    + author = models.CharField(max_length=50)  # 新增字段

执行后生成迁移文件,包含:

operations = [
    migrations.AddField(
        model_name='book',
        name='author',
        field=models.CharField(max_length=50),
    ),
]


2. migrate 命令

作用:将迁移脚本应用到数据库
本质:执行迁移文件中的 SQL 操作
流程

python manage.py migrate [app_name] [migration_name]

  • 检查 django_migrations 表(记录已应用的迁移)
  • 按依赖顺序执行未应用的迁移文件
  • 修改数据库结构(创建表/字段/索引等)

关键机制

  • 幂等性:重复执行不会改变最终状态
  • 原子性:默认事务执行(支持回滚)

3. 命令协作流程
graph LR
A[修改 models.py] --> B(makemigrations)
B --> C[生成迁移文件]
C --> D(migrate)
D --> E[更新数据库]

典型工作流

  1. 开发阶段修改模型
  2. 执行 makemigrations 生成迁移脚本
  3. 检查迁移文件(可手动修改)
  4. 执行 migrate 应用变更
  5. 生产环境同步执行步骤 2-4

4. 高级用法与注意事项

迁移回滚

# 回滚到指定迁移
python manage.py migrate app_name 0002_previous

迁移冲突解决

  • 当多人同时生成迁移时可能出现冲突
  • 手动合并 dependenciesoperations
  • 使用 --merge 选项(需谨慎)

最佳实践

  • 迁移文件必须纳入版本控制(Git)
  • 禁止直接修改数据库(绕过迁移系统)
  • 生产环境执行前务必备份
  • 使用 showmigrations 查看迁移状态

5. 迁移文件解析

典型迁移文件结构:

class Migration(migrations.Migration):
    dependencies = [
        ('app_name', '0001_initial'),  # 依赖的前序迁移
    ]
    operations = [
        migrations.CreateModel(...),  # 数据库操作指令
        migrations.AlterField(...),
    ]

其中操作类型包括:

  • CreateModel/DeleteModel
  • AddField/RemoveField
  • AlterUniqueTogether
  • RunPython(自定义操作)

通过合理使用迁移系统,可实现数据库结构的精确版本控制,确保开发、测试、生产环境的一致性。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐