在knex迁移中运行更新

时间:2016-09-29 02:28:44

标签: postgresql bookshelf.js knex.js

我想在表中添加一列,然后执行一些工作来填充列作为迁移的一部分。填充列需要在代码中进行一些操作。

考虑两个表:Users [user_id,first_name,last_name]和Orders [order_id,user_id,other_field_1,other_field_2]。

功能

var getNickName = function(user_row) {

    //do a bunch of javascripty stuff here
    //based on user_row.first_name and user_row.last_name.
    //i.e., stuff not possible in SQL

    return 'nickname';
}

我想要一个knex迁移,它会添加一个' user_nick_name'字段到Orders表。然后使用getNickName()的输出更新新列。

我需要这个在交易中。

我知道我需要将列添加到订单中,然后选择所有订单,迭代执行的订单:将用户行传递到getNickName,然后使用它来调用users表上的update设置值。

当涉及到交易时,我似乎无法获得所有这些的knex语法。

1 个答案:

答案 0 :(得分:4)

export function up(knex, Promise) {
  return knex.select()
  .from('Users')
  .then((users) => {
    const nickNames = users.map((user) => {
      return { userId: user.user_id, nickName: getNickName(row) };
    });
    return knex.transaction((trx) => {
      return knex.schema.table('Orders', (table) => table.string('user_nick_name').transacting(trx))
      .then(() => {
        return Promise.all(
          nickNames.map((row) => {
            return knex('Orders')
            .update({ user_nick_name: row.nickName })
            .where('user_id', row.userId)
            .transacting(trx);
          });
        );
      })
      .then(trx.commit)
      .catch(trx.rollback);
    });
  });
}

export function down(knex) {
  return knex.schema.table('Orders', (table) => table.dropColumn('user_nick_name'));
}