数据迁移
数据迁移是啥
数据迁移是指将数据从一个数据表迁移到另一个数据表的过程。
在本文中,介绍了两种数据迁移方案:
- 方案一: 使用mysql View 将旧表迁移到新表
- 方案二: 使用 JavaScript 脚本将旧表迁移到新表
模拟需求
有一张老的数据表student 和一张新的数据库表student_new,表结构如下:
-- oldCREATE 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;-- newCREATE 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 ASSELECT`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);}