Javascript 在knex迁移中更新枚举列类型

Javascript 在knex迁移中更新枚举列类型,javascript,enums,migration,knex.js,Javascript,Enums,Migration,Knex.js,我希望编写一个迁移字符串,向枚举列类型添加一个新字符串。我正在尝试将gamma添加到service列中 我尝试了下面的代码。这会发生冲突,因为表和列已经存在 const table = 'user_associations' export function up (knex, Promise) { return knex.schema.table(table, function (table) { table.enu('service', ['alpha', 'beta', 'ga

我希望编写一个迁移字符串,向枚举列类型添加一个新字符串。我正在尝试将
gamma
添加到
service
列中

我尝试了下面的代码。这会发生冲突,因为表和列已经存在

const table = 'user_associations'

export function up (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta', 'gamma']).notNullable()
  })
}

export function down (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta']).notNullable()
  })
}
  • notNull列是否需要默认值
  • 最好不要使用枚举,因为它不是被动的…我将在代码中使用小整数字段和常量来控制可选字段

截至2018-09-05,这仍然是一个悬而未决的问题:(我相信你已经打开了!)。如果您使用的是PostgreSQL,那么我会这样做:

  • 打开
    $psql
  • 连接到数据库
    >\c…
  • \dt
    查看所有表格
  • \d用户\u关联
    以查看该表的所有信息
  • 查找支票的名称。应该是
    user\u associations\u service\u check
  • 然后回到迁移中:

    exports.up = knex =>
      knex.raw(`
        ALTER TABLE ONLY user_associations
        DROP CONSTRAINT user_associations_service_check;
    
        ALTER TABLE ONLY user_associations
        ADD CONSTRAINT user_associations_service_check
        CHECK ("service" = ANY (ARRAY['alpha'::text, 'beta'::text, 'gamma'::text]));
      `)
    
    exports.down = knex =>
      knex.raw(`
        ALTER TABLE ONLY user_associations
        DROP CONSTRAINT user_associations_service_check;
    
        ALTER TABLE ONLY user_associations
        ADD CONSTRAINT user_associations_service_check
        CHECK ("service" = ANY (ARRAY['alpha'::text, 'beta'::text));
      `)
    

    上面链接的关于您的knexjs问题的评论有一个聪明的实用功能来实现这一点:。

    尝试在一次迁移中首先删除列,然后在第二次迁移中创建它。如果其他所有操作都失败,请使用纯sql尝试knex.raw
    exports.up = knex =>
      knex.raw(`
        ALTER TABLE ONLY user_associations
        DROP CONSTRAINT user_associations_service_check;
    
        ALTER TABLE ONLY user_associations
        ADD CONSTRAINT user_associations_service_check
        CHECK ("service" = ANY (ARRAY['alpha'::text, 'beta'::text, 'gamma'::text]));
      `)
    
    exports.down = knex =>
      knex.raw(`
        ALTER TABLE ONLY user_associations
        DROP CONSTRAINT user_associations_service_check;
    
        ALTER TABLE ONLY user_associations
        ADD CONSTRAINT user_associations_service_check
        CHECK ("service" = ANY (ARRAY['alpha'::text, 'beta'::text));
      `)