2016-09-27 71 views
2

我正在寻找写入迁移字符串以将新字符串添加到枚举列类型。我正在尝试将gamma添加到service列。在knex迁移中更新枚举列类型

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

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() 
    }) 
} 
+0

尝试在一个迁移第一删除列和第二迁移创建。如果一切都失败,请尝试使用纯sql的knex.raw – Sombriks

回答

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列需要一个默认值?
  • 最好不要用枚举“因为它不是反应......我会用微小的整型字段和常量的代码来控制可选字段