Sequelize-cli工具的使用(四) —— 编写/执行/撤销/回滚迁移脚本

416 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

上期讲到迁移脚本的两种方法,这次还有另一种方法以及如何执行。

7-2-3、up方法

up 方法中,我们主要编写创建表结构,或者新增修改表结构的相关代码。

  up: async (queryInterface, Sequelize) => {
    /**
      up 需要返回一个 Promise
      queryInterface.createTable 方法用于创建表
        - 第一个参数是要创建的表的名称
        - 第二个参数是一个对象,用来描述表中包含的字段信息
        - queryInterface.createTable 返回一个 Promise
     */
    return queryInterface.createTable('User',{
      id:{
        //字段类型:数字
        type: Sequelize.INTEGER,
        //设置为主键
        primaryKey:true,
        //自动增长
        autoIncrement:true
      },
      name:{
        //字符串类型(20长度)
        type: Sequelize.STRING(20),
        //值唯一
        unique:true,
        //不允许 null 值
        allowNull: false
      },
      password:{
        //字符串类型(32长度)
        type: Sequelize.STRING(32),
        //不允许 null 值
        allowNull: false
      },
      createdAt: {
        //日期类型
        type: Sequelize.DATE,
        //不允许 null 值
        allowNull: false
      }
    })
  }

type 字段类型,Sequelize 中支持的类型列表,参考后面的 DataTypes primaryKey 是否为主键 autoIncrement 自动增长 unique 值唯一 allowNull 是否允许Null 值,一般最好不要使用 Null defaultValue 默认值。 外键

userId: {
    type: Sequelize.INTEGER,
    references: {
        model: 'user',
        key: 'id'
    },
    onUpdate: 'cascade',
    onDelete: 'cascade'
},

7-3 执行迁移脚本

sequelize db:migrate

命令执行成功以后,我们就可以在数据库中看到对应的表以及字段信息了。 操作成功的同时数据库中会有一个叫做 SequelizeMeta 的表,这个表是用来记录我们已经执行过的迁移脚本的。当我们执行迁移命令的时候,它就会把当前执行的迁移脚本记录到该表中,下次执行迁移命令的时候就不会重复的去执行已经执行过的迁移脚本了。

7-4、 撤销/回滚

撤销/回滚 其实就是编写对应的 down脚本。

7-4-1、 down脚本

down 方法的本质就是 up 方法的一个反向操作。

down: async (queryInterface, Sequelize) => {
	//删除 user 表
    return queryInterface.dropTable('User');
  }

7-4-2、 执行down

单次撤销(最近的一次)

sequelize db:migrate:undo

撤销所有

sequelize db:migrate:undo:all

7-5、 更新迭代

许多时候,因为项目需求的变更,数据库也需要修改更新。比如,当用户修改信息的时候,我们希望记录下来最后一次修改更新的时间,也就是需要给 user 表新增一个 updateAt 字段。 添加一个新的迁移脚本

sequelize migration:create --name UserAddUpdateAt

脚本

module.exports = {
  up: async (queryInterface, Sequelize) => {
    //给 User 表添加列(字段): updateAt
    return queryInterface.addColumn('User','updatedAt',{
      type: Sequelize.DATE,
      allowNull:false
    })
  },

  down: async (queryInterface, Sequelize) => {
    //删除 user 表的 updatedAt 列(字段)
    return queryInterface.removeColumn('User','updatedAt');
  }
};

再次执行命令

sequelize db:migrate

成功以后,数据库中的 user 表中,就会多出一个新的字段:updatedAt