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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在knex迁移中更新枚举列类型相关的知识,希望对你有一定的参考价值。

我正在寻找一个迁移字符串来为枚举列类型添加一个新字符串。我正在尝试将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()
  })
}
答案
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'因为它不是被动...我会在代码中使用微小的整数字段和常量来控制可选字段
另一答案

截至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

以上是关于在knex迁移中更新枚举列类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在测试 laravel 中更改迁移中的枚举类型列

Knex迁移:交易查询已完成

在弹性豆茎上运行 knex 迁移

如何在 knex.js 模式的增量列中添加一个字母?

Knex - 已经是最新的

Knex:使用 FOREIGN KEY 创建迁移