2017-05-05 6 views
2

私はpostgresのpg-promiseを持つnode.jsで、2つの挿入を順番に実行しようとしています。最初の挿入の結果IDは、トランザクションの次の挿入時に使用する必要があります。pg-promise:トランザクション内の次のクエリで1つのクエリの結果を使用する

クエリのいずれかが失敗した場合のロールバック。 ネスティング2nd db.noneの内部.then()の最初のdb.oneは、最初のクエリをロールバックしません。ここでトランザクションを使用します。

第2問の第1問合せの結果を使用しています。 これは私が今持っているものです。

db.tx(function (t) { 
    return t.sequence([ 
     // generated using pgp.helpers.insert for singleData query 
     t.one("INSERT INTO table(a, b) VALUES('a', 'b') RETURNING id"), 
     t.none("INSERT INTO another_table(id, a_id) VALUES(1, <above_id>), (2, <above_id>)") 
    ]); 
})... 

2番目のクエリは、複数データクエリに対してpgp.helpers.insertを使用して生成されます。しかし、これは前のクエリの結果を使いたいとは考えにくいです。ではない !

id、つまり<above_id>を最初のINSERTから取得する方法はありますか?

+0

t.one結果にオブジェクトがあるはずです。それはあなたのIDを含みます。 @ vitay-tが説明するのを待つ: –

+0

それらを順番に実行したいのであれば 'batch'を使うのはなぜですか? – pozs

+0

@pozsそれは間違いだった。 t.sequenceは私が意味するものです。質問を編集しました。 – mythicalcoder

答えて

3

方法sequenceはあなたが達成しようとしているものとは何の関係も持っていない無限のシーケンス、実行することがある - 標準/些細なトランザクションを:

db.tx(t => { 
    return t.one('INSERT INTO table1(a, b) VALUES($1, $2) RETURNING id', [1, 2], x=>+x.id) 
     .then(id => { 
      return t.none('INSERT INTO table2(id, a_id) VALUES($1, $2)', [1, id]); 
     }); 
}) 
    .then(data => { 
     // success, data = null 
    }) 
    .catch(error => { 
     // error 
    }); 
+0

大丈夫ですが、標準取引がその方法です。今度は '.then(id => {'。それじゃありませんか?)これを試してみます。 – mythicalcoder

+0

は前回のトランザクションからidを取り出したいと思っていました。 multiDataは、pgpヘルパーを挿入します。それは働いた。ありがとう。 – mythicalcoder

関連する問題