更改表修改枚举在Knex js中为Postgresql提供错误

Arj*_*yak 8 enums knex.js postgresql-9.5

我正在使用knex js和postgresql数据库.我使用迁移文件来创建表knex migrate:make create_car_table.在这里我添加了一列fuel_type.table.enu('fuel_type', ['PETROL', 'DIESEL', 'CNG']).

现在我需要改变表格,我需要这些枚举值['HYBRID', 'ELECTRIC', 'PETROL', 'DIESEL'].

我使用knex migrate:make alter_car_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();
    });
};
Run Code Online (Sandbox Code Playgroud)

当我跑步时,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"
Run Code Online (Sandbox Code Playgroud)

我已经提到了Knex Js.

Mik*_*stö 9

更改列不适用于枚举类型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) { ... };
Run Code Online (Sandbox Code Playgroud)

您可能需要检查最初由数据库中的knex生成的约束名称.

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