我正在使用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();
    });
};

当我运行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"

我已经为此引用了Knex Js

最佳答案

Alter列不适用于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从数据库生成的约束名称。

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

关于enums - 在Postgresql的Knex js中修改表修改枚举会出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45299464/

10-12 16:50