Sequelize 移动迁移

Sequelize umzug migrations

我正在使用 sequelize js 并开发了一个 node js application,它已部署到生产环境并拥有实时数据库。

在开发模式下,如果我需要 alter DB,我曾经使用 Sequelize.sync({ force: true }) 来完成它并且它有效嗯。

但是现在,开发完成后我想修改一个table并向其中添加一列。

我搜索了很多帖子,但没有找到关于如何 运行 这些迁移的确切示例。

我尝试使用 Umzug 和 运行 进行迁移,但它向我抛出错误。

这是我试过的代码,

migrations/barmigration.js:

  var Sequelize = require('sequelize');

"use strict";

module.exports = {

    up: function(migration, DataTypes) {
      return [
      migration.addColumn(
        'Bars',
        'PrinterId',
        Sequelize.STRING
      ),
      migration.addColumn(
        'Bars',
        'PrinterStatus',
        Sequelize.STRING
      )]

    },

    down: function(migration, DataTypes) {
        return
         [
            migration.removeColumn('Bars', 'PrinterStatus'),
            migration.removeColumn('Bars', 'PrinterId')
        ]
    }

};

这里是umzug configuration:

 var Umzug = require('umzug');
    var sequelize = require('sequelize');

    var umzug = new Umzug({

        // storage: 'sequelize',
        model: 'Bar',


        storageOptions: {
            sequelize: sequelize,
        },

        migrations: {
            path: './migrations',
            pattern: /\.js$/
        }

    });

    //  umzug.up().then(function(migrations)  {
    //    console.log('Migration complete!');
   //     });

    umzug.down().then(function(migrations)  {
      console.log('Migration complete!');
    });

当我 运行 该文件时,我在 up function 的这个位置 return migration.addColumn

中收到错误

错误:

Unhandled rejection TypeError: Cannot read property 'addColumn' of undefined

所以,参数迁移好像是undefined。请帮帮我。

您需要在传递给 Umzug 的构造函数的对象的 migrations 属性中定义 params 属性 - 它定义传递给updown 函数。我想配置对象应该如下

{
    storage: 'sequelize',
    storageOptions: {
        sequelize: sequelize // here should be a sequelize instance, not the Sequelize module
    },
    migrations: {
        params: [
            sequelize.getQueryInterface(),
            Sequelize // Sequelize constructor - the required module
        ],
        path: './migrations',
        pattern: /\.js$/
    }
}

根据上述定义,migration 参数现在将变为 sequelize.getQueryInterface(),因此简单地 queryInterface,而 DataTypes 参数就是 Sequelize 本身。

model属性用于定义一个Sequelize迁移模型,如果您对默认的SequelizeMetatable创建满意,则无需定义。 Here is how the Umzug constructor object should look like, and herestorageOptions 的样子。

编辑

在单独的文件中,您需要创建一个 Sequelize 实例(进一步用于定义模型等)并将其导出。让我们假设文件树如下

 - db
     - database.js
     - umzug.js

所以在 database.js 我们创建一个 Sequelize 实例并导出它。

 // database.js
 const Sequelize = require('sequelize');

 const db = {
     sequelize: new Sequelize(connectionString, options),
     Sequelize: Sequelize
 };

 module.exports = db;

然后,在Umzug配置文件

// umzug.js
const db = require('./database');

// here comes the configuration and initialization of Umzug instance with use of db object
// db.sequelize -> sequelize instance
// db.Sequelize -> sequelize constructor (class)