我正在使用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/