如何正确使用迁移

时间:2019-04-10 06:21:46

标签: node.js mysqli migration sequelize.js

我的问题有点抽象,但我希望不要太多。

我正在建立一个使用Sequelize作为ORM的项目。它已经在生产中,这意味着我数据库中的数据无法删除。由于我们仍在开发中,因此有时需要更改数据库(更改列,添加列,删除列)。

在项目中,我正在使用sequelize.sync()。强制执行数据库更改的唯一选项是使用sequelize.sync({force: true}),但是此命令将从数据库中删除所有数据。

据我了解,我需要使用迁移。不幸的是,我已经阅读了文档并浏览了Stack Overflow,但仍然找不到有关如何进行迁移和保留数据的适当指南。

假设我有一个模型,User

module.exports = (sequelize, DataTypes) => {
  var Users = sequelize.define('user', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true
    },
    username: {
      type: DataTypes.STRING(20),
      unique: {
        msg: 'A person with the same username already exists!'
      },
      allowNull: false
    }, 
    password: {
      type: DataTypes.STRING(100),
      allowNull: false
    },
    phone: {
      type: DataTypes.STRING(50),
      allowNull: true,
      unique: {
        msg: 'A user with the same phone number already exists!'
      }
    }
  });

  Users.associate = function (models) {
    models.user.User_roles = models.user.belongsTo(models.user_role, {foreignKey: 'role'});

    models.user.Site_access = models.user.hasMany(models.site_access, {
      as: 'site_access',
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  };
  return Users;
};

说我想添加一列birthday TIMESTAMP而不擦除所有现有数据,该怎么做?

2 个答案:

答案 0 :(得分:1)

User表中添加列并使用alter

sequelize.sync({
    force: false,
    alter: true
 })

alter为true只会更新新列或已删除列,而不会删除数据。

答案 1 :(得分:0)

您也可以使用Sequelize CLI代替模型同步。这样一来,您还可以使用回滚,种子和模型来创建更复杂的迁移。