【问题标题】:sequelize-cli db:migrate "hangs" adding a check constraint to a newly-added columnsequelize-cli db:migrate "hangs" 向新添加的列添加检查约束
【发布时间】:2020-06-08 00:41:53
【问题描述】:

我有以下迁移文件:

'use strict';

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.transaction(t => {
            return queryInterface.addColumn('Vendors', 'status', Sequelize.STRING(30), { transaction: t }).then(() => {
                console.log("Created column..."); // this prints
                return queryInterface.addConstraint('Vendors', ['status'], {
                    type: 'check',
                    name: 'Vendors_status_check',
                    where: {
                        status: ['UNAPPROVED', 'SUBMITTED_FOR_APPROVAL', 'APPROVED', 'SUSPENDED']
                    },
                }, { transaction: t });
            }).catch(err => {
                console.log("Error::", err);
            });
        });
    },

    down: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.transaction(t => {
            // return queryInterface.removeColumn('Vendors', 'status', { transaction: t });
            return queryInterface.removeConstraint('Vendors', 'Vendors_status_check', { transaction: t }).then(() => {
                return queryInterface.removeColumn('Vendors', 'status', { transaction: t });
            });
        })
    }
};

当我运行 sequelize-cli db:migrate 时,我得到以下输出,然后命令只是“挂起”:永远不会完成,永远不会出错:

Sequelize CLI [Node: 12.14.1, CLI: 5.5.1, ORM: 5.21.3]

Loaded configuration file "config\sequelize_config.js".
Using environment "development".
== 20200224080020-vendor-status: migrating =======
Created column...

如果我完全注释掉queryInterface.addConstraint,则命令完成并将状态列添加到Vendors 表中。对 PostgresQL 运行此迁移,如果这有什么不同的话。

根据sequelize db:migrate hanging,我尝试添加dialectOptions: {ssl: true} 来对配置进行后续处理,但除了弃用警告之外没有其他效果。

更新 1

FWIW,运行以下代码(即没有事务)按预期工作:

return queryInterface.addColumn('Vendors', 'status', {type: Sequelize.STRING(30)}/* , { transaction: t } */).then(() => {
    console.log("Created column..."); // this prints
    return queryInterface.addConstraint('Vendors', ['status'], {
        type: 'check',
        name: 'Vendors_status_check',
        where: {
            status: ['UNAPPROVED', 'SUBMITTED_FOR_APPROVAL', 'APPROVED', 'SUSPENDED']
        },
    }/* , { transaction: t } */);
}).catch(err => {
    console.log("Error::", err);
});

【问题讨论】:

  • 它可能正在等待锁定。检查来自不同连接的pg_stat_activity() 以进行验证。
  • 嗯...这是一个开发数据库,​​除了我正在运行的代码之外,没有其他活动针对它。但是,它确实可以在没有事务的情况下工作。 OTOH,在发布这个问题之前,我已经尝试了几个小时的细微变化......
  • @a_horse_with_no_name 我知道pg_stat_activity() 是什么(PostgresQL 的新手)和 AFA,我可以识别,没有活动连接。
  • @markvgti 你发现了吗?
  • @Prof 不记得了????,对不起!

标签: node.js postgresql sequelize.js sequelize-cli


【解决方案1】:

addConstraint 不能将事务作为选项。所以解决方案是不在事务中包装对它的调用。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多