2017-10-18 16 views
1

documentation de Knex pour les transactions a du code qui ressemble à ceci:Quand utiliser Knex transiger() vs enchaînant sur l'objet de TRX

knex.transaction(function(trx) { 
    var books = [ 
     {title: 'Canterbury Tales'}, 
     {title: 'Moby Dick'}, 
     {title: 'Hamlet'} 
    ]; 

    return trx 
    .insert({name: 'Old Books'}, 'id') 
    .into('catalogues') 
    .then(function(ids) { 
    return Promise.map(books, function(book) { 
     book.catalogue_id = ids[0]; 

     // Some validation could take place here. 

     return trx.insert(info).into('books'); 
    }); 
    }); 
}) 

Ici, sur SO Je l'ai vu l'utilisation extensive d'une fonction transacting() avec des exemples que ressembler à ceci:

knex.transaction(function(trx) { 
    knex('foo') 
    .transacting(trx) 
    .insert({id:"bar", username:"bar"}) 
    // etc 
}) 

Knex décrit transacting() avec des exemples similaires ci-dessus:

Utilisée par knex.transaction, la méthode transacting peut être chaînée à n'importe quelle requête et passer l'objet pour lequel vous souhaitez joindre la requête dans le cadre de la transaction.

Ma question est:

Quelle est la différence entre trx.insert().into('foo') et knex('foo').transacting(trx).insert() et pourquoi voudriez-vous utiliser une place de l'autre?

Répondre

2

Il est commode d'utiliser .transacting(trx) lorsque vous souhaitez effectuer plusieurs opérations dans la même transaction:

knex.transaction(function (trx) { 
    return Promise.all([ 
     knex('foo').insert({ name: 'My Name' }).transacting(trx), 
     knex('bar').insert({ field: 'Value' }).transacting(trx) 
    ]) 
    // ---- or something like ---- 
    return Promise.all(SOME_INPUT_VALUES.map(function (value) { 
     return knex('foo_bar').update('lul', value.lul).where('id', value.id).transacting(trx) 
    })) 
}) 

Je ne sais pas vraiment d'un usage particulier de l'autre méthode. Ce pourrait être juste une question de style. Vous avez deux interfaces et vous pouvez choisir celui que vous préférez. Quant à moi, je suis habitué à .transacing(trx)

+0

C'est en effet une question de style. Utiliser '.transacting()' est l'ancienne méthode et utiliser 'trx' comme instance de knex est une nouvelle façon. La manière la plus récente a été ajoutée pour rendre plus difficile l'omission de la définition de la transaction pour les requêtes, qui sont assez difficiles à repérer les bogues. Donc, en général, on devrait utiliser 'trx ('table'). Insert (...)' style. –