如何在Django/Python中高效迁移数据至UserLicense模型?
Django 从License1/License2高效迁移数据到UserLicense模型(SQLite)
前提准备
确保你已经完成UserLicense模型的定义,并执行过数据库迁移:
python manage.py makemigrations python manage.py migrate
迁移前务必备份db.sqlite3文件,避免数据丢失。
方式一:Django Shell 快速批量迁移
适合测试环境或数据量较小的场景,操作步骤如下:
- 启动Django Shell
python manage.py shell
- 执行迁移代码
# 导入项目模型(替换成你的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)}")
方式二:自定义迁移文件(生产环境推荐)
适合需要纳入版本控制、可重复执行的生产场景:
- 生成空迁移文件
python manage.py makemigrations your_app --empty
- 编辑生成的迁移文件(替换
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), ]
- 执行迁移
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
相关产品推荐
相关产品推荐

