2016-09-29 3 views
3

테이블에 열을 추가 한 다음 마이그레이션의 일부로 열을 채우기 위해 일부 작업을 수행하고 싶습니다. 열을 채우려면 코드에서 일부 조작이 필요합니다.Knex 마이그레이션 내부에서 업데이트 실행

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'; 
} 

나는 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')); 
} 
관련 문제