4

PostgreSQL で like 句を使用pg-promiseして選択クエリを実行するために使用しています。残念ながら、クエリはエラー コード as08P01とエラー メッセージで失敗しています

bind メッセージは 1 つのパラメーターを提供しますが、準備済みステートメント "" には 0 が必要です

クエリは次のとおりです

select user_name, user_id from users where user_name like '$1#%'

パラメータ化されたクエリを次のように使用しています

var userQuery:pgp.ParameterizedQuery = new pgp.ParameterizedQuery("<above_query>", [userName]);

クエリの実行に使用される API は次のとおりです。

each(query:TQuery, values:any, cb:(row:any, index:number, data:Array<any>)=>void, thisArg?:any):XPromise<Array<any>>;

私は pg-promise の例を見ましたが、パラメーター化されたクエリで LIKE 句を使用していません。

環境の詳細は

pg-約束: 4.3.2

PostgreSQL: 9.6

ノード: 5.7.1

更新: 1query API (プレーン テキスト SQL) を使用してクエリを実行できますが、 each. APIのeach使用中にLIKE句が失敗する理由を誰か説明してください。Parameterized

4

1 に答える 1

7

ParameterizedQuery APIから:

パラメーター化されたクエリはデータベース サーバーによってフォーマットされるため、クエリで使用できるのは基本的な変数 ( $1、など) のみです。$2

タイプPreparedStatementおよびParameterizedQueryは、それらを実行するnode-postgresドライバー内の対応するオブジェクトを表します。これらのオブジェクトは、クエリとフォーマット パラメータの両方をカプセル化します。

つまり、これら 2 つのオブジェクトの要点は、クエリと書式設定パラメーターの両方をサーバーに渡すことです。したがって、内部のクエリ書式設定エンジンを使用するのではなく、サーバーで書式設定されます。

そのため、構文など、pg-promiseの内部クエリ フォーマット機能にアクセスすることはできません。クエリを直接、クエリ文字列またはQueryFileオブジェクトとして使用している場合は、クエリの書式設定にpg-promise$1#構文を使用できます。

PreparedStatementParameterizedQueryを使用する$1, $2,...と、データベース サーバーでサポートされているパラメータ フォーマットの基本的なタイプにしかアクセスできず、それ以外には何もアクセスできません。


PS私はpg-promiseの作者です。

于 2016-06-13T13:20:03.117 に答える