一个迁移文件中的多个迁移语句

时间:2015-11-03 15:15:07

标签: node.js error-handling migration sails.js sequelize.js

我尝试在一个迁移文件中执行多个迁移语句,以便一次更改同一个表的多个列。

我想知道我是否以写入方式执行此操作,或者是否有更好的更合适的方式来执行此操作:

迁移代码

module.exports = {
    up: function(queryInterface, Sequelize, done) {

        queryInterface.changeColumn('users', 'name', {
            type: Sequelize.STRING,
            allowNull: false,
            require: true,
            unique: true
        }).success(function() {
            queryInterface.changeColumn('users', 'address', {
                type: Sequelize.STRING,
                allowNull: false,
                require: true,
                unique: true
            }).success(function() {
                queryInterface.changeColumn('users', 'city', {
                    type: Sequelize.STRING,
                    allowNull: false,
                    require: true,
                    unique: true
                }).success(function() {
                    queryInterface.changeColumn('users', 'state', {
                        type: Sequelize.STRING,
                        allowNull: false,
                        require: true,
                        defaultValue: "ncjnbcb"
                    });
                    done();
                });
            });
        });
    }
};

但我面临一个错误:

  

TypeError:undefined不是函数

由于我在迁移中找不到任何调试错误的方法,如果有人帮助我解决它或者如果可能的话,告诉我们如何找出迁移中的错误的方式将会很棒。

4 个答案:

答案 0 :(得分:13)

你的TypeError可能是因为你没有返回任何东西。 docs表示每个迁移函数都应该返回一个Promise。没有提到done回调。

为此,请尝试以下方法:

return Promise.all([
  queryInterface.changeColumn..., 
  queryInterface.changeColumn...
]);

答案 1 :(得分:3)

因此,这是2个答案的组合。

@Firmino Changani-效果很好,但即使失败也会完成一些迁移

@Aswin Sanakan-意味着它们都可以迁移或不迁移,但是如果第二个迁移依赖于第一个迁移,则将无法工作

我正在创建一个表并向该表添加特殊索引。所以我最终将它们结合起来,以下对我有用:

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    return queryInterface.sequelize.transaction(async t => {
      try {
        await queryInterface.createTable(
          'phonenumbers',
          {
            id: {
              allowNull: false,
              autoIncrement: true,
              primaryKey: true,
              type: Sequelize.INTEGER
            },
            full_number: {
              type: Sequelize.STRING,
              unique: true
            },
            phone: {
              type: Sequelize.STRING
            },
            extension: {
              type: Sequelize.INTEGER,
            },
            country_id: {
              type: Sequelize.INTEGER
            },
            is_valid_format: {
              type: Sequelize.BOOLEAN
            },
            type: {
              type: Sequelize.STRING
            },
            createdAt: {
              allowNull: false,
              type: Sequelize.DATE
            },
            updatedAt: {
              allowNull: false,
              type: Sequelize.DATE
            },
          },
          { transaction: t }
        ),
        await queryInterface.addIndex(
          'phonenumbers',
          ['phone'],
          {
            name: 'constraint-phone-extension',
            where: {extension: null},
            transaction: t
          }
        )
        return Promise.resolve();
      } catch (e) {
        return Promise.reject(e);
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    return queryInterface.sequelize.transaction(async t => {
      try {
        await queryInterface.dropTable('phonenumbers', { transaction: t }),
        await queryInterface.removeIndex('phonenumbers', 'constraint-phone-extension', { transaction: t })
        return Promise.resolve();
      } catch (e) {
        return Promise.reject(e);
      }
    })
  }
};

答案 2 :(得分:2)

module.exports = {
  up: async (queryInterface, Sequelize) => {
    try {
      await queryInterface.addColumn('User', 'name', {
        type: Sequelize.STRING
      });
      await queryInterface.addColumn('User', 'nickname', {
        type: Sequelize.STRING
      });
      return Promise.resolve();
    } catch (e) {
      return Promise.reject(e);
    }
  },

  down: async (queryInterface, Sequelize) => {
    try {
      await queryInterface.removeColumn('Challenges', 'name');
      await queryInterface.removeColumn('Challenges', 'nickname');
      return Promise.resolve();
    } catch (e) {
      return Promise.reject(e);
    }
  }
};

答案 3 :(得分:0)

在交易中使用const wrapper = mount(PermissionTable, { localVue, vuetify, propsData: { value: tableItems }, sync: false }); (迁移更安全):

Promise.all

如果某些查询被拒绝,则不使用事务而使用module.exports = { up: async (queryInterface, Sequelize) => { return queryInterface.sequelize.transaction(t => { return Promise.all([ queryInterface.changeColumn('users', 'name', { type: Sequelize.STRING }, { transaction: t } ), queryInterface.changeColumn('users', 'address', { type: Sequelize.STRING }, { transaction: t } ), queryInterface.changeColumn('users', 'city', { type: Sequelize.STRING }, { transaction: t } ) ]); }); }, down: async (queryInterface, Sequelize) => { return queryInterface.sequelize.transaction((t) => { return Promise.all([ queryInterface.removeColumn('users', 'name', { transaction: t }), queryInterface.removeColumn('users', 'address', { transaction: t }), queryInterface.removeColumn('users', 'city', { transaction: t }) ]) }) } }; 会导致问题。使用事务是安全的,这样可以成功执行所有操作或不进行任何更改。