2017-05-05 33 views
2

我與Postgres的PG-承諾的node.js內,試圖做一個交易與2個插入順序。第一次插入的結果ID應該在事務的下一個插入中使用。PG-承諾:使用一個查詢一個查詢結果事務

回滾如果任何查詢失敗。 嵌套第二db.none內的第1 db.one.then()將不會回滾1查詢。所以在這裏使用交易。

我停留在使用第二個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>)") 
    ]); 
})... 

第二查詢使用pgp.helpers.insert用於多數據查詢生成。但是,想要使用以前的查詢結果是不可行的。不是嗎!

有沒有辦法讓id即從第1 INSERT <above_id>

+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

好的,標準交易是最好的選擇。現在我可以後'。然後(ID => {'。難道不是嗎?我會嘗試了這一點創建了'pgp.helpers.insert'二次插入查詢。 – mythicalcoder

+0

只是想採取從以前的事務ID和創建多數據插入查詢pgp助手。它的工作。謝謝。 – mythicalcoder

相關問題