Я хотел бы выполнить запрос PostgreSQL в Python с помощью psycopg2, который фильтрует столбцом типа 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. То, что, кажется, происходит, - то, что Пост-ГРЭС неявно не преобразует массив строк в массив меток времени. Это преобразует единственную прекрасную строку, и массив хорошо работает, если я явно добавляю ::timestamp
к каждому элементу в pgAdmin, но я не знаю, как сделать это в psycopg2.
Каков лучший способ сделать это кроме упущения параметров DB-API и просто создания длинной строки меток времени вручную? Есть ли какой-либо способ, которым я могу заставить это бросать к корректному типу?
Попробуйте вот так:
SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s::timestamp[])