2016-09-29 9 views
3

テーブルに列を追加してから、移行の一部として列を入力する作業を実行します。列を取り込むには、コード内でいくつかの操作が必要です。knexの移行で更新を実行する

Users [user_id、first_name、last_name]、Orders [order_id、user_id、other_field_1、other_field_2]の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'; 
} 

私は、Ordersテーブルに 'user_nick_name' フィールドを追加しknex移行をしたいです。次に、新しい列をgetNickName()の出力で更新します。

これはトランザクションに必要です。

私は注文に列を追加する必要があることを知っているすべての注文を選択し、実行している注文を反復する:ユーザーの行をgetNickNameに渡し、それを使用して値を設定するユーザーテーブルの更新を呼び出します。

トランザクションが関わっているとき、私はこのすべてのためにknex構文を取得できないようです。

答えて

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')); 
} 
関連する問題