2016-09-27 5 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

попытки бросить столбец первым в одной миграции и создать его на вторую миграции , если все остальное не удается, попробуйте knex.raw с чистым sql – 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 необходимо значение по умолчанию?
  • лучше не использовать перечисление, потому что это не вступает в реакции ... Я буду использовать крошечное целое поле и константы в коде для управления необязательного поля