ご想像のとおり、テーブル名などをクエリパラメータとして渡すことはできません。
それらはプロトコルレベルのバインドパラメータとして送信され、(重要なことに)クエリはプレースホルダーとして有効なSQLとして解析可能である必要があります。これは、SQLレベルを実行してから、PREPARE
を分離する場合と同じですEXECUTE
。適切な識別子の引用符を使用して、準備する前にSQL文字列にフォーマットする必要があります。
置換する識別子を二重引用符で囲み、渡される文字列内で引用符で囲まれたシーケンスを途中で終了する可能性のある二重引用符に注意してください。これらは2倍にする必要があります。たとえば、テーブル名some"table
には次のものを使用します。
'SELECT * FROM "{0}"'.format('some""table');
SQLインジェクションは非常に深刻なリスクです。あなたはあなたの引用を正確に正しくしなければなりません。理想的には、PostgreSQLSQL関数に相当するクライアント側を見つけますquote_ident
。
二重引用符で囲まれた識別子では大文字と小文字が区別されることに注意してください。常に二重引用符で囲まれた識別子を使用して、DBで同じ大文字と小文字を区別して作成してください。引用符で囲まれた識別子と引用符で囲まれていない識別子を混在させないでください。