Python中如何实现django数据迁移工具

https://github.com/FingerLiu/django-supertube

支持字段映射和动态字段转化。 欢迎 star,issue


Python中如何实现django数据迁移工具
1 回复

在Django里,数据迁移主要用makemigrationsmigrate这两个命令。

核心流程:

  1. 生成迁移文件:当你改了模型(比如在models.py里新增字段),在项目根目录运行:

    python manage.py makemigrations
    

    这会在对应app的migrations文件夹下生成一个.py文件,里面记录了模型的变化。

  2. 执行迁移:生成文件后,运行:

    python manage.py migrate
    

    这个命令会按顺序执行所有还没应用到数据库的迁移文件,真正修改数据库结构。

关键操作和代码示例:

  • 查看迁移计划:在真正执行migrate前,可以用--plan--sqlmigrate看看它会做什么:

    python manage.py migrate --plan
    python manage.py sqlmigrate your_app_name 0001_initial  # 查看某个迁移文件对应的SQL
    
  • 指定App或迁移:可以只针对特定app操作,或者回退到某个版本:

    python manage.py makemigrations your_app_name
    python manage.py migrate your_app_name 0002  # 迁移到0002这个特定版本
    
  • 处理迁移冲突:如果多人开发出现迁移文件编号冲突,可以用--merge

    python manage.py makemigrations --merge
    
  • 自定义数据迁移:如果需要迁移数据(不仅仅是改结构),可以创建一个空的数据迁移文件,然后在里面写Python代码:

    python manage.py makemigrations your_app_name --empty
    

    生成文件后,编辑它,在operations列表里使用RunPython,例如把一个字段的值复制到另一个字段:

    # 在生成的迁移文件中
    from django.db import migrations
    
    def copy_data(apps, schema_editor):
        YourModel = apps.get_model('your_app_name', 'YourModel')
        for obj in YourModel.objects.all():
            obj.new_field = obj.old_field
            obj.save()
    
    class Migration(migrations.Migration):
        dependencies = [...]
        operations = [
            migrations.RunPython(copy_data),
        ]
    

总结:用makemigrations生成变更记录,用migrate应用到数据库。

回到顶部