在 knex 迁移中运行更新

she*_*mus 5 postgresql bookshelf.js knex.js

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

考虑两个表:

  • 用户[ user_id, first_name, last_name ],和
  • 订单[ 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';
    }
Run Code Online (Sandbox Code Playgroud)

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

我需要这是在交易中

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

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

Sin*_*nux 6

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'));
}
Run Code Online (Sandbox Code Playgroud)