数据迁移
数据迁移是啥
数据迁移是指将数据从一个数据表迁移到另一个数据表的过程。
在本文中,介绍了两种数据迁移方案:
- 方案一: 使用mysql View 将旧表迁移到新表
- 方案二: 使用 JavaScript 脚本将旧表迁移到新表
模拟需求
有一张老的数据表student
和一张新的数据库表student_new
,表结构如下:
-- old
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`studentId` varchar(255) DEFAULT NULL COMMENT '学生ID',
`name` varchar(255) DEFAULT NULL COMMENT '学生名字',
`gender` varchar(255) DEFAULT NULL COMMENT '性别',
`dateOfBirth` varchar(255) DEFAULT NULL COMMENT '出生日期',
`classId` varchar(255) DEFAULT NULL COMMENT '班级ID',
`level` varchar(255) DEFAULT NULL COMMENT '年级',
`bodyHeight` varchar(255) DEFAULT NULL COMMENT '身高',
`studentStatus` varchar(255) DEFAULT NULL COMMENT '学生状态',
`remarks` mediumtext COMMENT '备注',
`operation` varchar(255) DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
`operationByUserId` varchar(255) DEFAULT NULL COMMENT '操作者userId',
`operationByUser` varchar(255) DEFAULT NULL COMMENT '操作者用户名',
`operationAt` varchar(255) DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
PRIMARY KEY (`id`) USING BTREE,
KEY `studentId` (`studentId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb4;
-- new
CREATE TABLE `student_new` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`studentId` varchar(255) DEFAULT NULL COMMENT '学生ID',
`studentName` varchar(255) DEFAULT NULL COMMENT '学生名字',
`studentGender` varchar(255) DEFAULT NULL COMMENT '性别',
`dateOfBirth` varchar(255) DEFAULT NULL COMMENT '出生日期',
`classId` varchar(255) DEFAULT NULL COMMENT '班级ID',
`level` varchar(255) DEFAULT NULL COMMENT '年级',
`bodyHeight` varchar(255) DEFAULT NULL COMMENT '身高',
`studentStatus` varchar(255) DEFAULT NULL COMMENT '学生状态',
`remarks` mediumtext COMMENT '备注',
`operation` varchar(255) DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
`operationByUserId` varchar(255) DEFAULT NULL COMMENT '操作者userId',
`operationByUser` varchar(255) DEFAULT NULL COMMENT '操作者用户名',
`operationAt` varchar(255) DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
PRIMARY KEY (`id`) USING BTREE,
KEY `studentId` (`studentId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb4;
需求:将student
数据迁移至student_new
方案一: 使用mysql View将旧表迁移到新表的方案
- 第一步: 使用mysql view将新表的数据准备好
DROP VIEW IF EXISTS `view01_migrate_student_new`;
CREATE VIEW view01_migrate_student_new AS
SELECT
`student`.`id` AS `id`,
`student`.`studentId` AS `studentId`,
`student`.`name` AS `studentName`,
`student`.`gender` AS `studentGender`,
`student`.`dateOfBirth` AS `dateOfBirth`,
`student`.`classId` AS `classId`,
`student`.`level` AS `level`,
`student`.`bodyHeight` AS `bodyHeight`,
`student`.`studentStatus` AS `studentStatus`,
`student`.`remarks` AS `remarks`,
`student`.`operation` AS `operation`,
`student`.`operationByUserId` AS `operationByUserId`,
`student`.`operationByUser` AS `operationByUser`,
`student`.`operationAt` AS `operationAt`
FROM
`student`;
- 第二步: 将
view01_migrate_student_new
写入到student_new
表-- 多次执行需要删除上一次的数据
INSERT INTO student_new SELECT * FROM view01_migrate_student_new;
方案二: 使用 JavaScript 脚本将旧表迁移到新表
使用脚本是一种比较笨的方法,但是也是一种兼容性最高的方法,可以方便的处理任何数据结构差异带来的数据问题
const knex = require('knex')({
client: 'mysql',
connection: {
host: 'source_database_host',
user: 'source_database_username',
password: 'source_database_password',
database: 'source_database_name'
}
});
async function migrateData() {
const oldList = await knex('student').select();
const newList = oldList.map(old => {
const { name: studentName, gender: studentGender, ...other } = old;
return { studentName, studentGender, ...other };
})
// 注意: 多次执行需要删除上一次的数据
await targetDb('student_new').insert(newList);
}