2016-09-29 2 views
3

Ich möchte eine Spalte zu einer Tabelle hinzufügen und dann einige Arbeiten ausführen, um die Spalte als Teil der Migration aufzufüllen. Das Auffüllen der Spalte erfordert einige Manipulationen im Code.Führen Sie das Update innerhalb der Knex-Migration aus

Betrachten Sie zwei Tabellen: Benutzer [user_id, first_name, last_name] und Bestellungen [order_id, user_id, other_field_1, other_field_2].

Und die Funktion

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

Ich mag eine Knex Migration, die ein 'user_nick_name' Feld der Orders-Tabelle erstellt. Dann wird die neue Spalte mit der Ausgabe von getNickName() aktualisiert.

Ich brauche dies in einer Transaktion zu sein.

Ich weiß, ich muss die Spalte zu Bestellungen hinzufügen, dann wählen Sie alle Aufträge, durchlaufen über die Aufträge durchführen: übergeben Sie die Benutzerzeile in getNickName, verwenden Sie das, um Update in der Tabelle users aufrufen den Wert.

Ich kann einfach nicht die Knex-Syntax für all dies zu bekommen, wenn eine Transaktion beteiligt ist.

Antwort

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')); 
} 
Verwandte Themen