Node.js 将迁移更改列续写为FK,然后撤消失败

Node.js 将迁移更改列续写为FK,然后撤消失败,node.js,mariadb,sequelize.js,Node.js,Mariadb,Sequelize.js,我正在尝试创建迁移文件,以将changeColumn转换为string(来自enum)并引用其他表 const enumStatus = ['PENDING', 'SUCCESSFUL', 'FAILED', 'FAILED_LAST_VALUE_MISSING', 'FAILED_LAST_DATE_MISSING', 'FAILED_OLD_LAST_DATE']; module.exports = { up: async(queryInterface, Sequelize) =>

我正在尝试创建迁移文件,以将changeColumn转换为string(来自enum)并引用其他表

const enumStatus = ['PENDING', 'SUCCESSFUL', 'FAILED', 'FAILED_LAST_VALUE_MISSING', 'FAILED_LAST_DATE_MISSING', 'FAILED_OLD_LAST_DATE'];

module.exports = {
  up: async(queryInterface, Sequelize) => {
    return Promise.all([
      queryInterface.changeColumn('MeasurementTestResults', 'status', {
        type: Sequelize.STRING,
        allowNull: false
      }), queryInterface.addConstraint('MeasurementTestResults', {
        fields: ['status'],
        type: 'foreign key',
        name: 'statusFk',
        references: {
          table: 'MeasurementTestResultStatusEnums',
          field: 'code'
        },
        onDelete: 'cascade',
        onUpdate: 'cascade'
      })
    ]);
  },

  down: async(queryInterface, Sequelize) => {
    return Promise.all([
      queryInterface.removeConstraint('MeasurementTestResults', 'statusFk'),
      queryInterface.changeColumn('MeasurementTestResults', 'status', {
        type: Sequelize.ENUM(...enumStatus),
        allowNull: false
      })
    ]);
  }
};
db:migrate运行得很完美,但当我尝试调用db:migrate:undo时,它会无序执行命令吗

== 20201217194748-measurementTestResult_changeColumn_status: reverting =======
Executing (default): SELECT CONSTRAINT_CATALOG AS constraintCatalog, CONSTRAINT_NAME AS constraintName, CONSTRAINT_SCHEMA AS constraintSchema, CONSTRAINT_TYPE AS constraintType, TABLE_NAME AS tableName, TABLE_SCHEMA AS tableSchema from INFORMATION_SCHEMA.TABLE_CONSTRA
INTS WHERE table_name='MeasurementTestResults' AND constraint_name = 'statusFk' AND TABLE_SCHEMA = 'iot_crcm_application_data1';
Executing (default): ALTER TABLE `MeasurementTestResults` CHANGE `status` `status` ENUM('PENDING', 'SUCCESSFUL', 'FAILED', 'FAILED_LAST_VALUE_MISSING', 'FAILED_LAST_DATE_MISSING', 'FAILED_OLD_LAST_DATE') NOT NULL;
Executing (default): ALTER TABLE `MeasurementTestResults`
      DROP FOREIGN KEY `statusFk`;

ERROR: (conn=143438, no: 1832, SQLState: HY000) Cannot change column 'status': used in a foreign key constraint 'statusFk'
sql: ALTER TABLE `MeasurementTestResults` CHANGE `status` `status` ENUM('PENDING', 'SUCCESSFUL', 'FAILED', 'FAILED_LAST_VALUE_MISSING', 'FAILED_LAST_DATE_MISSING', 'FAILED_OLD_LAST_DATE') NOT NULL; - parameters:[]

然后,当我尝试删除
queryInterface.removeConstraint('measurementestresults','statusFk'),
这一行从down脚本中删除时,它可以工作,但在我错误地尝试它之前不能…

不要尝试使用
Promise.all并行执行相互依赖的结构更改。你最好一个接一个地给他们打电话:

等待queryInterface.removeConstraint('MeasurementSetResults','statusFk')
等待queryInterface.changeColumn('MeasurementTestResults','status','{
类型:Sequelize.ENUM(…enumStatus),
allowNull:错误
})

up
方法也是如此。

非常简单,但非常有效,感谢您的支持。这对我来说是非常新的,这是我的第一个自上而下的脚本。如果MariaDB支持结构更改,请不要忘记添加事务。好的,谢谢提醒。行