6

現在、Python の psycopg のモジュール内の PostgreSQL クエリでプレース ホルダーを使用しようとしています。ここに私が使用しているコードのサンプルがあります。

table.execute('SELECT * FROM table WHERE col2 = %s ORDER BY pID ASC LIMIT %s OFFSET %s;',(val1,val2,val3))

このようなプレースホルダーを LIMIT と OFFSET に使用することはできないとどこかで読みましたが、WHERE = にはこのプレースホルダー形式を使用する必要があります。

python / postgresql / psycopg2でユーザー入力から「order by」句を安全に指定する

このSQLクエリの適切なプレースホルダー構文を知っている人はいますか? ありがとう!

4

2 に答える 2

5

制限とオフセットはどちらもプレースホルダーで問題なく使用できます。

一般的に、式で「値」が許可される場所であればどこでもプレースホルダーを使用できます。

cur.execute("select * from node where node_name = %s limit %s offset %s", ('test', 5, 5))

正常に動作します。

参照記事ですでに述べたように、プレースホルダーを使用して、テーブル、列、スキーマ、またはそれらのエイリアスを参照することはできません。このような場合、通常、executeを呼び出す前に独自の変数置換を行う必要があります。

于 2013-01-28T03:39:12.637 に答える
0

LIMIT非常に古いバージョンの PostgreSQL では、 andOFFSET節でプレースホルダーを使用することは実際には不可能でした。この機能はバージョン 7.4 で追加されたため、現在のインストールに存在すると想定しても安全です。

ただし、これはサーバー側の準備済みステートメントにのみ適用されます。Psycopg は、サーバー側の準備済みステートメントを使用しません。独自の文字列置換を行い、結果の文字列を定数としてバックエンドに送信します。したがって、原則として、結果のリテラルが構文的に有効な場所ならどこでも、そのパラメーター置換機能を使用できます。

したがって、あなたがやろうとしていることは、どちらの方法でも問題ありません。

于 2013-01-28T16:10:29.777 に答える