Enums Knex js for Postgresql中的Alter table modify enum出现错误

Enums Knex js for Postgresql中的Alter table modify enum出现错误,enums,knex.js,postgresql-9.5,Enums,Knex.js,Postgresql 9.5,我正在使用knex js和postgresql数据库。我使用迁移文件创建了一个表knex migrate:make create\u car\u table。在本文中,我添加了一个列fuel_类型表.enu('燃料类型',['汽油','柴油','压缩天然气]) 现在我需要修改表,并且需要这些枚举值['HYBRID'、'ELECTRIC'、'汽油机'、'DIESEL'] 我使用knex migrate:make alter\u car\u table创建了另一个迁移文件,并添加了以下代码 expo

我正在使用knex js和postgresql数据库。我使用迁移文件创建了一个表
knex migrate:make create\u car\u table
。在本文中,我添加了一个列fuel_类型<代码>表.enu('燃料类型',['汽油','柴油','压缩天然气])

现在我需要修改表,并且需要这些枚举值
['HYBRID'、'ELECTRIC'、'汽油机'、'DIESEL']

我使用
knex migrate:make alter\u car\u table
创建了另一个迁移文件,并添加了以下代码

exports.up = function(knex, Promise) {
    return knex.schema.alterTable('car', function (table) {
        table.enu('fuel_type', ['HYBRID', 'ELECTRIC', 'PETROL', 'DIESEL']).alter();
    });
};

exports.down = function(knex, Promise) {
    return knex.schema.alterTable('car', function (table) {
        table.enu('fuel_type', ['PETROL', 'DIESEL', 'CNG']).alter();
    });
};
当我运行
knex migrate:latest
时,我得到以下错误

Knex:warning - migrations failed with error: alter table "car" alter column "fuel_type" type text check ("fuel_type" in ('HYBRID', 'ELECTRIC', 'PETROL', 'DIESEL')) using ("fuel_type"::text check ("fuel_type" in ('HYBRID', 'ELECTRIC', 'PETROL', 'DIESEL'))) - syntax error at or near "check"

我已经对此进行了引用。

Alter column不适用于
knex 0.13.0
中的枚举类型

枚举也是作为检查约束实现的,所以要更改它,需要重新创建

大概是这样的:

exports.up = function(knex, Promise) {
  return knex.schema.raw(`
    ALTER TABLE "car"
    DROP CONSTRAINT "car_fuel_type_check",
    ADD CONSTRAINT "car_fuel_type_check" 
    CHECK (fuel_type IN ('HYBRID', 'ELECTRIC', 'PETROL', 'DIESEL'))
  `);
};

exports.down = function(knex, Promise) { ... };
您可能需要检查最初由knex从DB生成的约束名称


当前,修改枚举的唯一方法是
knex.schema.raw

首先需要删除现有约束,并使用新值创建一个新约束。 下面的代码示例应该会有所帮助

exports.up = function(knex, Promise) {
  return knex.schema.raw(`
    ALTER TABLE "car" DROP CONSTRAINT "car_fuel_type_check";
    ALTER TABLE "car" ADD CONSTRAINT "car_fuel_type_check" CHECK (fuel_type IN ('HYBRID'::text, 'ELECTRIC'::text, 'PETROL'::text, 'DIESEL'::text))
  `);
};

// The reverse migration is similar
exports.down = function(knex, Promise) {
  return knex.schema.raw(`
    ALTER TABLE "car" DROP CONSTRAINT "car_fuel_type_check";
    ALTER TABLE "car" ADD CONSTRAINT "car_fuel_type_check" CHECK (fuel_type IN ('PETROL'::text, 'DIESEL'::text, 'CNG'::text));
  `);
};

我假设您的约束名称是
汽车燃油类型检查
。如果没有,您应该用您的约束名称替换
汽车燃油类型检查。

谢谢@mikael我更改了约束名称,它成功了。