背景
在作后台接口开发时,咱们总会遇到新增字段或者修改字段的问题。
在开发阶段咱们能够删表重建,可是上线以后可不能这么搞了。因此数据迁移就很重要了。javascript
所谓的数据迁移原理其实就是将数据复制出来而后再把表删了从新建表同时把数据再复制进去。java
这里我用到的ORM
是Sequelize
因此下面简单介绍一下Sequelize
实现数据迁移的过程。mysql
实现
安装 sequelize/cli 依赖
npm install --save-dev sequelize-cli
初始化
在项目目录(我这里是starter
)执行下面的命令git
npx sequelize-cli init
会在当前目录下生成相关目录以下:
github
config/config.json
:包含配置文件,它告诉CLI
如何链接数据库。可直接从项目的数据库配置中复制过来,内容以下:
{ "development": { "username": "root", "password": "数据库密码", "database": "lin-cms", "host": "localhost", "dialect": "mysql" }, "test": { "username": "root", "password": "数据库密码", "database": "lin-cms", "host": "localhost", "dialect": "mysql" }, "production": { "username": "root", "password": "数据库密码", "database": "lin-cms", "host": "localhost", "dialect": "mysql" } }
migrations
:包含全部迁移文件。数据迁移的主要文件,后面介绍。seeders
:包含全部种子文件。使用样本数据或测试数据填充数据库表时可使用seeders
文件去实现。好比向用户表中插入用户:
module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.bulkInsert('Users', [{ firstName: 'John', lastName: 'Doe', email: 'example@example.com', createdAt: new Date(), updatedAt: new Date() }]); }, down: (queryInterface, Sequelize) => { return queryInterface.bulkDelete('Users', null, { }); } };
models
:包含你的项目的全部模型。
实现数据迁移
目的是要在已经存在的
goods
表中增长pay_type
字段,而且不删除表中的数据。web
咱们先按照上面的步骤完成初始化以后,就能够建立迁移文件了。
可经过以下命令建立文件:sql
npx sequelize-cli migration:generate --name migration-good-add-paytype-column
migration-good-add-paytype-column
:是咱们的迁移文件名称
执行完以后会在migrations
文件夹下生成文件:
接下来就是在该文件中编写迁移逻辑了,文件内容以下:数据库
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { /** * Add altering commands here. 更新的操做 * * Example: * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); */ return queryInterface.sequelize.transaction(t => { return Promise.all([ // 在 goods 表中增长 string 类型的 pay_type 字段 queryInterface.addColumn('Goods', 'pay_type', { type: Sequelize.DataTypes.STRING }, { transaction: t }), ]); }); }, down: async (queryInterface, Sequelize) => { /** * Add reverting commands here. 回退的操做 * * Example: * await queryInterface.dropTable('users'); */ } };
编写完迁移逻辑以后,执行以下命令便可完成数据迁移:npm
npx sequelize-cli db:migrate
最后咱们能够在数据库表中看到已经在现有数据的基础上增长了pay_type
字段。
json
多表依赖可参考文档中的介绍。
Sequelize 高级专题
TIP:
在新增完字段以后,应该还须要在原有的Model
对象里面添加,如这里是model/good.js
须要增长pay_type
不然添加商品信息该字段没有添加成功。(目前测试是这样)
import sequelize from '../lib/db'; import { Sequelize } from 'sequelize'; import { GoodParentCategory } from './good-category'; // 这是咱们用于如下示例的模型的设置 const Good = sequelize.define('good', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, title: { type: Sequelize.STRING(50), allowNull: false }, // 新增 brand:{ type: Sequelize.STRING(50), allowNull: false }, image: { type: Sequelize.STRING(100), allowNull: false }, category: { type: Sequelize.STRING(10), allowNull: false }, stock: { type: Sequelize.INTEGER, allowNull: false }, original_price: { type: Sequelize.INTEGER, allowNull: false }, price: { type: Sequelize.INTEGER, allowNull: false }, // 新增 pay_type:{ type: Sequelize.STRING(10), allowNull: false }, summary: { type: Sequelize.STRING(1000), allowNull: false }, }); GoodParentCategory.hasMany(Good); Good.belongsTo(GoodParentCategory); export { Good };
参考
本文同步分享在 博客“_龙衣”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。