sequelize-cli db: переносить "зависает", добавляя проверочное ограничение к вновь добавленному столбцу - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующий файл миграции:

'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 hang Я попытался добавить 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);
});
...