NodeJS 后端开发

Stella981
• 阅读 780

文章目录

背景

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

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

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

实现

安装 sequelize/cli 依赖

npm install --save-dev sequelize-cli

初始化

NodeJS 后端开发

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

npx sequelize-cli init

会在当前目录下生成相关目录如下:
NodeJS 后端开发

  • 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字段,并且不删除表中的数据。

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

npx sequelize-cli migration:generate --name migration-good-add-paytype-column
  • migration-good-add-paytype-column:是我们的迁移文件名称
    执行完之后会在migrations文件夹下生成文件:
    NodeJS 后端开发

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

'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');
     */
  }
};

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

npx sequelize-cli db:migrate

最后我们可以在数据库表中看到已经在现有数据的基础上增加了pay_type字段。
NodeJS 后端开发

多表依赖可参考文档中的介绍。
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源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这