NodeJS 后端开发

文章目录

背景

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

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

这里我用到的ORM是Sequelize所以下面简单介绍一下Sequelize实现数据迁移的过程。

实现

安装 sequelize/cli 依赖

npm install --save-dev sequelize-cli

初始化

在这里插入图片描述

在项目目录(我这里是starter)执行下面的命令

npx sequelize-cli init

会在当前目录下生成相关目录如下:
在这里插入图片描述

  • config/config.json:包含配置文件,它告诉CLI如何连接数据库。可直接从项目的数据库配置中复制过来,内容如下:

    {

    "development": {

    1"username": "root", 2"password": "数据库密码", 3"database": "lin-cms", 4"host": "localhost", 5"dialect": "mysql"

    }, "test": {

    1"username": "root", 2"password": "数据库密码", 3"database": "lin-cms", 4"host": "localhost", 5"dialect": "mysql"

    }, "production": {

    1"username": "root", 2"password": "数据库密码", 3"database": "lin-cms", 4"host": "localhost", 5"dialect": "mysql"

    } }

  • migrations:包含所有迁移文件。数据迁移的主要文件,后面介绍。

  • seeders:包含所有种子文件。使用样本数据或测试数据填充数据库表时可以使用seeders文件去实现。比如向用户表中插入用户:

    module.exports = {

    up: (queryInterface, Sequelize) => {

    1return queryInterface.bulkInsert('Users', [{ 2 3 4 5 firstName: 'John', 6 lastName: 'Doe', 7 email: 'example@example.com', 8 createdAt: new Date(), 9 updatedAt: new Date() 10}]);

    }, down: (queryInterface, Sequelize) => {

    return queryInterface.bulkDelete('Users', null, {
    

    }); } };

  • models:包含你的项目的所有模型。

实现数据迁移

目的是要在已经存在的 goods表中增加pay_type字段,并且不删除表中的数据。

我们先按照上面的步骤完成初始化之后,就可以创建迁移文件了。
可通过如下命令创建文件:

npx sequelize-cli migration:generate --name migration-good-add-paytype-column
  • migration-good-add-paytype-column:是我们的迁移文件名称
    执行完之后会在migrations文件夹下生成文件:
    在这里插入图片描述

接下来就是在该文件中编写迁移逻辑了,文件内容如下:

1'use strict'; 2 3module.exports = { 4 5 6 7 up: async (queryInterface, Sequelize) => { 8 9 10 11 /** 12 * Add altering commands here. 更新的操作 13 * 14 * Example: 15 * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); 16 */ 17 return queryInterface.sequelize.transaction(t => { 18 19 20 21 return Promise.all([ 22 // 在 goods 表中增加 string 类型的 pay_type 字段 23 queryInterface.addColumn('Goods', 'pay_type', { 24 25 26 27 type: Sequelize.DataTypes.STRING 28 }, { 29 30 31 transaction: t }), 32 33 ]); 34 }); 35 }, 36 37 down: async (queryInterface, Sequelize) => { 38 39 40 41 /** 42 * Add reverting commands here. 回退的操作 43 * 44 * Example: 45 * await queryInterface.dropTable('users'); 46 */ 47 } 48}; 49

编写完迁移逻辑之后,执行如下命令即可完成数据迁移:

npx sequelize-cli db:migrate

最后我们可以在数据库表中看到已经在现有数据的基础上增加了pay_type字段。
在这里插入图片描述

多表依赖可参考文档中的介绍。
Sequelize 高级专题

TIP:
在新增完字段之后,应该还需要在原有的Model对象里面添加,如这里是model/good.js需要增加pay_type否则添加商品信息该字段没有添加成功。(目前测试是这样)

1import sequelize from '../lib/db'; 2import { 3 4 5 6 Sequelize 7} from 'sequelize'; 8import { 9 10 11 12 GoodParentCategory 13} from './good-category'; 14 15// 这是我们用于以下示例的模型的设置 16const Good = sequelize.define('good', { 17 18 19 20 id: { 21 22 23 24 type: Sequelize.INTEGER, 25 primaryKey: true, 26 autoIncrement: true 27 }, 28 title: { 29 30 31 32 type: Sequelize.STRING(50), 33 allowNull: false 34 }, 35 // 新增 36 brand:{ 37 38 39 40 type: Sequelize.STRING(50), 41 allowNull: false 42 }, 43 image: { 44 45 46 47 type: Sequelize.STRING(100), 48 allowNull: false 49 }, 50 category: { 51 52 53 54 type: Sequelize.STRING(10), 55 allowNull: false 56 }, 57 stock: { 58 59 60 61 type: Sequelize.INTEGER, 62 allowNull: false 63 }, 64 original_price: { 65 66 67 68 type: Sequelize.INTEGER, 69 allowNull: false 70 }, 71 price: { 72 73 74 75 type: Sequelize.INTEGER, 76 allowNull: false 77 }, 78 // 新增 79 pay_type:{ 80 81 82 83 type: Sequelize.STRING(10), 84 allowNull: false 85 }, 86 summary: { 87 88 89 90 type: Sequelize.STRING(1000), 91 allowNull: false 92 }, 93}); 94GoodParentCategory.hasMany(Good); 95Good.belongsTo(GoodParentCategory); 96 97export { 98 99 100 101 Good 102};

参考

本文同步分享在 博客“_龙衣”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

PPDB:今晚老齐直播

【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

NodeJS 后端开发 - HelloWorld