2016-08-07 10 views
1

私はNode.jsのためpg-promiseを使用しています、と私は、トランザクションについてのドキュメントを正しく理解していますことを確認したかったです。トランザクションを使用するときに、クエリ内に含まれるサブクエリはpg-promiseでどのように機能しますか?

は、私は次のトランザクションを実行すると言う:

db.tx(function(t) { 
    t.any('SELECT * FROM users') 
    .then(function(users) { 
    var queries = []; 
    for (var i =0; i < users.length; i++) { 
     queries.push(t.any("INSERT INTO stocks_owned (ticker, shares, user_id) VALUES ('GOOG', 10, $1)", users[i].user_id)); 
    } 
    return t.batch(queries); 
    }) 
}) 

クエリは、この最後まで実行されますpostgresには?

Postgresのトランザクションは次のようになります。

つまり
BEGIN; 
SELECT * FROM users; 
SAVEPOINT my_savepoint; 
INSERT INTO stocks_owned (ticker, shares, user_id) VALUES ('GOOG', 10, 1); 
INSERT INTO stocks_owned (ticker, shares, user_id) VALUES ('GOOG', 10, 2); 
... 
INSERT INTO stocks_owned (ticker, shares, user_id) VALUES ('GOOG', 10, 999); 
COMMIT; 

、他のクエリ内に含まれるサブクエリが同じBEGIN/COMMITブロックに含まれるのですか?

答えて

0

これは実行何クエリをpostgresにしてしまうのだろうか?

セーブポイントはネストされたトランザクションの代わりに使用されるだけなので、SAVEPOINTはありません。

他のクエリに含まれるサブクエリは同じBEGIN/COMMITブロックに含まれますか?

サブクエリのようなものはありませんが、ビューの運転点から、単に照会し、トランザクション内で実行されるすべてのものはBEGIN/COMMITブロック内であろうがあります。


正確に、あなたはpg-monitorを使用する必要がありますpg-promiseによって実行される、または非常に少なくともされているかを確認するには - event queryを扱う:以下

var pgOptions = { 
    query: function (e) { 
     console.log(e.query); // log the query being executed 
    } 
}; 

var pgp = require('pg-promise')(pgOptions); 

は、あなたのコード内の間違いです。

t.any('SELECT * FROM users') 

return t.any('SELECT * FROM users') 

コールバックから何も返されていないため、そこにトランザクションロジックはありません。

あなたがそこにしようとしていた何をすべきか最短かつ最も効率的な方法:

db.tx(t => { 
    return t.map('SELECT * FROM users', [], user => { 
     return t.none("INSERT INTO stocks_owned(ticker, shares, user_id) VALUES('GOOG', 10, ${user_id})", user); 
    }).then(t.batch); 
}) 
    .then(data => { 
     // success, data = [null, null, ...] 
    }) 
    .catch(error => { 
     // error 
    }); 

UPDATE

上記の例では、もはやそれを行うための最も効率的な方法です。最も効率的なアプローチは、1つの選択した後、1つの複数行の挿入を実行することです。 Multi-Row Insertsを参照してください。

+0

ありがとうございました!あなたのパッケージはすばらしいbtwです(卑劣な言い伝えが意図されていません)。乾杯。 –

+0

"サブクエリのようなものはありません"。まあ、サブクエリのようなものがありますが、明らかにnode-pgレベルではありません。サブクエリは、1つのクエリが別のクエリを含むSQLの構文です。 'SELECT ... FROM ... WHERE x =(SELECT ...) 'SELECT ... FROM(SELECT ..)' –

+1

@CraigRinger私は明示的に 'ドライバの観点から'と言うように修正しました。これは私たちが議論していたものです。そのレベルとは無関係のクエリです。 –

関連する問題