9

type の列でフィルタリングする psycopg2 を使用して、Python で PostgreSQL クエリを実行したいと思いますtimestamp without timezone。(範囲ではなく) タイムスタンプに許可される値の長いリストがあり、psycopg2 は便利に配列を処理するので、これはうまくいくはずだと思いました:

SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s)

timesパラメータはdatetimeオブジェクトのリストです。私も試しpsycopg2.Timestamp()ました。どちらも変換されWHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...])、残念ながら次のエラーで失敗します。

operator does not exist: timestamp without time zone = text
LINE 3: WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

これはpgAdminでも確認済みですので、psycopg2だけではありません。起こっているように見えるのは、Postgres が文字列の配列をタイムスタンプの配列に暗黙的に変換しないということです。pgAdminの各要素に明示的に追加すると、単一の文字列が正常に変換され、配列::timestampが正常に機能しますが、psycopg2でそれを行う方法がわかりません。

DB-API パラメータを忘れて、タイムスタンプの長い文字列を手動で作成する以外に、これを行う最善の方法は何ですか? 正しい型にキャストする方法はありますか?

4

2 に答える 2

13

次のようにしてみてください。

SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s::timestamp[])
于 2009-12-30T08:04:40.950 に答える
3

psycopg2 バージョン 2.2.0 以降を使用する場合、値をTimestamp()コンストラクターでラップすると、元のコードが機能するはずです。

以前に動作しなかった理由は、psycopg2 実装のバグでした。推奨される回避策は、別の回答で提案されているように、明示的なキャストを SQL に挿入することでした。

于 2011-01-31T14:06:07.550 に答える