尝试删除约束和更改列时 Knex 向下迁移错误

Knex migration down error when trying to drop constraint and alter column

在之前的迁移中,我有一个名为 status 的列,它是 boolean。在此迁移中,我将其更改为整数并创建了对 meetings_statuses.

的引用

这是迁移:

exports.up = (knex) => {
  return knex.schema.alterTable("meetings", (table) => {
    table.integer("status").notNullable().unsigned().alter();

    table
      .foreign("status")
      .references("id")
      .inTable("meetings_statuses")
      .onDelete("RESTRICT");
  });
};

exports.down = (knex) => {
  return knex.schema.debug().alterTable("meetings", (table) => {
    table.dropForeign("status");

    table.boolean("status").notNullable().defaultTo(true).alter();
  });
};

向下迁移时我想返回到旧的列类型并删除外部关系。但是,当我这样做时,出现错误:

migration file "20210205004841_alter_meetings_table.js" failed
migration failed with error: alter table "meetings" alter column "status" type boolean using ("status"::boolean) - foreign key

调试显示如下:

[
  {
    sql: 'alter table "meetings" alter column "status" drop default',
    bindings: []
  },
  {
    sql: 'alter table "meetings" alter column "status" drop not null',
    bindings: []
  },
  {
    sql: 'alter table "meetings" alter column "status" type boolean using ("status"::boolean)',
    bindings: []
  },
  {
    sql: `alter table "meetings" alter column "status" set default '1'`,
    bindings: []
  },
  {
    sql: 'alter table "meetings" alter column "status" set not null',
    bindings: []
  },
  {
    sql: 'alter table "meetings" drop constraint "meetings_status_foreign"',
    bindings: []
  }
]

我的想法是,由于某种原因,Knex 试图先更改列而不是删除约束,从而导致错误,但我找不到任何解决方案。

谁能帮帮我?

您必须先删除外键,然后再更改它。


exports.down = async(knex) => {
  await knex.schema.alterTable("meetings", (table) => {
    table.dropForeign("status");
  });
  await knex.schema.alterTable("meettings", (table) => {
    table.boolean("status").notNullable().defaultTo(true).alter();
  });
};