タイムスタンプ用の配列のpsycopg2パラメーターを指定する方法(データタイム)
-
22-09-2019 - |
質問
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が文字列の配列をタイムスタンプの配列に暗黙的に変換しないということです。明示的に追加すると、単一の文字列が微細に変換され、配列が正常に機能します ::timestamp
pgadminの各要素には、psycopg2でそれを行う方法がわかりません。
DB-APIパラメーターを忘れて、タイムスタンプの長い文字列を手動で構築する以外に、これを行う最良の方法は何ですか?正しいタイプにキャストさせる方法はありますか?
解決
このように試してみてください:
SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s::timestamp[])
他のヒント
psycopg2バージョン2.2.0以降を使用する場合、値を包む場合は、元のコードが機能するはずです Timestamp()
あなたが提案したように、コンストラクター。
以前に機能しなかった理由は、PSYCOPG2実装のバグでした。提案された回避策は、別の答えで示唆されているように、明示的なキャストをSQLに挿入することでした。