2011-12-29 6 views
27

データベースからフェッチする行のIDのリストがあります。私はPythonとpsycopg2を使用しています。私の問題は、これらのIDをSQLに効果的に渡す方法です。私は、リストの長さを知っていれば、必要に応じて手動または自動で多くの "%s"式をクエリ文字列に追加できるので簡単ですが、ここではどれだけ必要なのか分かりません。 sql "id IN(id1、id2、...)"文を使用してその行を選択する必要があることは重要です。リストの長さをチェックし、適切な数の "%s"をクエリ文字列に連結することは可能ですが、非常に遅くて醜いのではないかと恐れています。誰かがそれを解決する方法のアイデアを持っていますか?なぜ私は "IN"ステートメントでそれを行う必要があるのか​​尋ねないでください。それは私のクラス割り当ての一部であるベンチマークです。前もって感謝します!psycopg2のSQLへのパラメータリストの受け渡し

+0

SQLの回答に反対していますか?動的SQLを使用すると、任意の長さの文字列を指定し、SQLに正しく読み込ませることができます。 – Twelfth

答えて

47

Pythonのタプルはpsycopg2のSQLリストに変換されます。

cur.mogrify("SELECT * FROM table WHERE column IN %s;", ((1,2,3),)) 

う出力Pythonの新規参入については

'SELECT * FROM table WHERE column IN (1,2,3);' 

:タプルではなく、ここにリストを使用するには、残念ながら重要です。 2番目の例:

cur.mogrify("SELECT * FROM table WHERE column IN %s;", 
    tuple([row[0] for for in rows])) 
+0

ありがとう、私はそれに気付かなかった。あなたの解決策の唯一の問題は、そのタプルでカンマを忘れてしまったことです。 –

+0

thanks - fixed it – philofinfinitejest

+25

Python LISTSはPostgres ARRAY型に変換されるので、私はcursor.execute(...)引数に(tuple(SOME_LIST))のようなことを頻繁に行う必要があることがわかります。リストのtuple()を単一要素のリテラルタプルにラップする方法に注意してください。この例ではタプルのタプルがあります。 –

関連する問題