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

问题描述 投票:3回答:2

我正在寻找一个迁移字符串来为枚举列类型添加一个新字符串。我正在尝试将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()
  })
}
javascript enums migration knex.js
2个回答
2
投票
const tableName = 'user_associations'

export function up (knex, Promise) {
  let existRows;
  return knex.select()
  .from(tableName)
  .then((rows) => {
    existRows = rows
    return knex.schema.table(tableName, (table) => table.dropColumn('service'))
  })
  .then(() => knex.schema.table(tableName, (table) => table.enu('service', ['alpha', 'beta', 'gamma']).notNullable().default('alpha')))
  .then(() => {
    return Promise.all(existRows.map((row) => {
      return knex(tableName)
      .update({ service: row.service })
      .where('id', row.id)
    }))
  })
}

export default down(kenx, Promise) {
  let existRows;
  return kenx.select()
  .from(tableName)
  .then((rows) => {
    existRows = rows
    return knex.schema.table(tableName, (table) => table.dropColumn('service'))
  })
  .then(() => knex.schema.table(tableName, (table) => table.enu('service', ['alpha', 'beta']).notNullable().default('alpha')))
  .then(() => {
    return Promise.all(existRows.map((row) => {
      return knex(tableName)
      .update({ service: row.service === 'gamma' ? 'alpha' : row.service })
      .where('id', row.id)
    }))
  })
}
  • notNull列需要默认值吗?
  • 最好不要使用enum'因为它不是被动...我会在代码中使用微小的整数字段和常量来控制可选字段

0
投票

截至2018-09-05,这仍然是一个悬而未决的问题:https://github.com/tgriesser/knex/issues/1699(我相信你打开了它!)。如果您正在使用PostgreSQL,那么这就是我要做的:

  1. 打开$ psql
  2. 连接到您的数据库> \c ...
  3. > \dt看到所有表格
  4. > \d user_associations查看该表的所有信息
  5. 找到支票的名称。它应该是user_associations_service_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问题的评论有一个聪明的实用功能来完成这个:https://github.com/tgriesser/knex/issues/1699#issuecomment-402603481

© www.soinside.com 2019 - 2024. All rights reserved.