2017-07-25 25 views
2

我正在使用knex js和postgresql數據庫。我用遷移文件創建了一張表knex migrate:make create_car_table。在這個我添加了一個列fuel_type。 table.enu('fuel_type', ['PETROL', 'DIESEL', 'CNG'])修改PostgreSQL的Knex js中的表修改枚舉給出錯誤

現在我需要改變表格,我需要這些枚舉值['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

回答

1

更改列不適用於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) { ... }; 

您可能需要檢查最初由來自DB knex產生的約束名。

當前knex.schema.raw是修改枚舉的唯一方法。

+0

感謝@mikael我改變了約束名稱,它的工作。 –