You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django/Python中高效迁移数据至UserLicense模型?

Django 从License1/License2高效迁移数据到UserLicense模型(SQLite)

前提准备

确保你已经完成UserLicense模型的定义,并执行过数据库迁移:

python manage.py makemigrations
python manage.py migrate

迁移前务必备份db.sqlite3文件,避免数据丢失。


方式一:Django Shell 快速批量迁移

适合测试环境或数据量较小的场景,操作步骤如下:

  1. 启动Django Shell
python manage.py shell
  1. 执行迁移代码
# 导入项目模型(替换成你的app名称)
from your_app.models import License1, License2, UserLicense

# 从两个License模型中提取去重的用户数据
license1_users = License1.objects.values('user_name', 'full_name', 'email').distinct()
license2_users = License2.objects.values('user_name', 'full_name', 'email').distinct()

# 合并数据并基于user_name去重(避免违反UserLicense的unique约束)
unique_users = {}
for user in list(license1_users) + list(license2_users):
    # 处理原模型中为空的email(新模型要求必填,可根据业务调整默认值)
    if not user['email']:
        user['email'] = 'no-email@example.com'
    # 用user_name作为唯一标识,重复时保留最后一条记录
    unique_users[user['user_name']] = user

# 批量创建UserLicense记录,已存在的用户跳过
for user_data in unique_users.values():
    try:
        UserLicense.objects.get_or_create(
            user_name=user_data['user_name'],
            defaults={
                'full_name': user_data['full_name'],
                'email': user_data['email']
            }
        )
    except Exception as e:
        print(f"处理用户 {user_data['user_name']} 失败: {str(e)}")

方式二:自定义迁移文件(生产环境推荐)

适合需要纳入版本控制、可重复执行的生产场景:

  1. 生成空迁移文件
python manage.py makemigrations your_app --empty
  1. 编辑生成的迁移文件(替换000x_empty_migration.py为实际文件名)
from django.db import migrations
from your_app.models import License1, License2, UserLicense

def migrate_user_data(apps, schema_editor):
    # 提取并去重用户数据
    license1_users = License1.objects.values('user_name', 'full_name', 'email').distinct()
    license2_users = License2.objects.values('user_name', 'full_name', 'email').distinct()
    
    unique_users = {}
    for user in list(license1_users) + list(license2_users):
        if not user['email']:
            user['email'] = 'no-email@example.com'
        unique_users[user['user_name']] = user
    
    # 批量创建记录
    for user_data in unique_users.values():
        try:
            UserLicense.objects.get_or_create(
                user_name=user_data['user_name'],
                defaults={
                    'full_name': user_data['full_name'],
                    'email': user_data['email']
                }
            )
        except Exception as e:
            print(f"处理用户 {user_data['user_name']} 失败: {str(e)}")

class Migration(migrations.Migration):
    # 依赖项:替换为UserLicense模型对应的迁移文件编号
    dependencies = [
        ('your_app', '000x_userlicense_initial'),
    ]

    operations = [
        migrations.RunPython(migrate_user_data),
    ]
  1. 执行迁移
python manage.py migrate

迁移验证

执行以下命令确认数据迁移成功:

python manage.py shell
from your_app.models import UserLicense
# 查看迁移后的用户数量
print(UserLicense.objects.count())
# 随机抽查一条数据
print(UserLicense.objects.first().__dict__)

关键注意事项

  • 空Email处理:原模型email允许为空,但UserLicense要求必填,必须设置默认值或过滤空值记录,否则会触发数据库完整性错误。
  • 去重逻辑:UserLicense的user_name和full_name均为唯一约束,若原数据存在重复值,需根据业务规则调整(如合并记录、保留最新数据等)。
  • 性能优化:若数据量较大,可将批量创建拆分为分批次处理(如每100条执行一次),避免内存占用过高。

内容的提问来源于stack exchange,提问作者Angel Gabriel Chable Concepcio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:22:21