# 数据迁移工具 用于将测试数据库的数据迁移到生产数据库,避免ID冲突,使用事务确保数据一致性。 ## 功能特性 - ✅ 自动避免ID冲突(使用数据库自增ID) - ✅ 使用事务确保每个任务和结果数据的一致性 - ✅ 自动跳过已存在的任务(基于task_uuid) - ✅ 保留原始时间戳 - ✅ 处理NULL值 - ✅ 详细的日志输出和统计信息 ## 使用方法 ### 基本用法 ```bash # 从dev环境迁移到prod环境 go run cmd/migrate/main.go -test-env=dev -prod-env=prod # 从prod环境迁移到dev环境(测试反向迁移) go run cmd/migrate/main.go -test-env=prod -prod-env=dev ``` ### 参数说明 - `-test-env`: 测试环境配置文件名(dev/prod),默认值:dev - `-prod-env`: 生产环境配置文件名(dev/prod),默认值:prod ### 编译后使用 ```bash # 编译 go build -o migrate cmd/migrate/main.go # 运行 ./migrate -test-env=dev -prod-env=prod ``` ## 工作原理 1. **连接数据库**:同时连接测试数据库和生产数据库 2. **读取数据**:从测试数据库读取所有任务和结果数据(LEFT JOIN) 3. **检查重复**:基于`task_uuid`检查生产数据库中是否已存在 4. **事务迁移**:为每个任务创建独立事务: - 创建任务记录(自动生成新ID) - 如果存在结果数据,创建结果记录(关联新任务ID) - 提交事务或回滚 5. **统计报告**:输出迁移统计信息 ## 注意事项 1. **配置文件**:确保`config/config_dev.yaml`和`config/config_prod.yaml`存在且配置正确 2. **数据库权限**:确保数据库用户有读写权限 3. **网络连接**:确保能同时连接到两个数据库 4. **数据备份**:迁移前建议备份生产数据库 5. **ID冲突**:脚本会自动处理ID冲突,使用数据库自增ID,不会覆盖现有数据 ## 输出示例 ``` 从测试数据库读取到 100 条任务记录 [1/100] 创建任务成功: task_uuid=xxx, 新ID=1001 [1/100] 创建结果成功: task_id=1001 [2/100] 跳过已存在的任务: task_uuid=yyy, id=1002 ... 迁移完成统计: 成功: 95 条 跳过: 3 条 失败: 2 条 数据迁移完成! ```