NodeJS 后端开发 - 使用 sequelize/cli 实现 mysql 数据迁移

背景

在作后台接口开发时,咱们总会遇到新增字段或者修改字段的问题。
在开发阶段咱们能够删表重建,可是上线以后可不能这么搞了。因此数据迁移就很重要了。javascript

所谓的数据迁移原理其实就是将数据复制出来而后再把表删了从新建表同时把数据再复制进去。java

这里我用到的ORMSequelize因此下面简单介绍一下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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索