7

node-postgres モジュールを使用して、postgres で「準備済みステートメント」を作成したいと考えています。バインドはループで行われるため、パラメーターにバインドせずに作成したい。

ドキュメントで私が読んだ:

query(object config, optional function callback) : Query
If _text_ and _name_ are provided within the config, the query will result in the creation of a prepared statement.

私は試した

client.query({"name":"mystatement", "text":"select id from mytable where id=$1"});

しかし、構成オブジェクトでテキストと名前のキーのみを渡そうとすると、例外が発生します:

(翻訳済み) メッセージは 0 個のパラメータをバインドしていますが、準備されたステートメントは 1 個を期待しています

私が欠けているものはありますか?ループのすべてのステップでステートメントを再準備することを避けるために、特定の値にバインドせずにステートメントを作成/準備するにはどうすればよいですか?

4

3 に答える 3

15

node-postgres の作成者によるこの問題に関する回答を見つけました。

node-postgres を使用すると、名前付きクエリを初めて発行すると、一度に解析、バインド、および実行されます。同じ名前の同じ接続で発行された後続のすべてのクエリは、「解析」ステップを自動的にスキップし、既に計画されたクエリのみを再バインドして実行します。

現在、node-postgres は、名前付きの準備済みクエリを作成し、クエリを実行しない方法をサポートしていません。この機能は、libpq およびクライアント/サーバー プロトコル (純粋な JavaScript バインディングで使用) 内でサポートされていますが、API で直接公開していません。API が複雑になるだけで、何のメリットもないと思っていました。名前付きステートメントはそれらが作成されたクライアントにバインドされるため、クライアントが切断されて再接続された場合、または別のクライアントがクライアント プールから返された場合、名前付きステートメントは機能しなくなります (再解析が必要です)。

于 2012-09-08T18:54:23.673 に答える
2

そのためにpg-preparedを使用できます。

var prep = require('pg-prepared')

// First prepare statement without binding parameters
var item = prep('select id from mytable where id=${id}')

// Then execute the query and bind parameters in loop
for (i in [1,2,3]) {
  client.query(item({id: i}), function(err, result) {...})
}
于 2016-08-28T22:29:59.893 に答える
1

更新:あなたの質問をもう一度読んでください。あなたがする必要があると私が信じていることは次のとおりです。「値」配列も渡す必要があります。

明確にするために。通常、クエリを「準備」する場所で、値配列なしで、渡すオブジェクトを準備するだけです。次に、通常クエリを「実行」する場所で、オブジェクトに値の配列を設定し、それをクエリに渡します。初めての場合、ドライバーは最初に実際の準備を行い、残りの反復では単純にバインディングと実行を行います。

于 2012-09-08T15:56:28.903 に答える