2009-12-30 10 views
9

Chciałbym uruchomić kwerendę PostgreSQL w Pythonie za pomocą psycopg2, która filtruje według kolumny typu timestamp without timezone. Mam długą listę dozwolonych wartości dla znacznika czasu (zamiast zakresie) i psycopg2 wygodnie obsługuje macierze, więc pomyślałem, że to powinno działać:Jak określić parametr psycopg2 dla tablicy dla znaczników czasu (dat):

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

Parametr times jest lista datetime obiektów. Próbowałem też psycopg2.Timestamp(). Obaj przekłada się WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]) i niestety, że nie powiedzie się z powodu następującego błędu:

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. 

Mam potwierdził to w pgAdmin, tak więc nie jest to tylko psycopg2. Wygląda na to, że Postgres nie będzie niejawnie konwertować tablicy łańcuchów na tablicę znaczników czasu. Będzie konwertować jeden ciąg grzywny i tablica działa dobrze, jeśli jawnie dodać ::timestamp do każdego elementu w pgAdmin, ale nie wiem, jak to zrobić w psycopg2.

Jaki jest najlepszy sposób na to, poza zapominaniem parametrów interfejsu DB-API i ręcznym tworzeniem długich łańcuchów znaczników czasu? Czy istnieje sposób, w jaki mogę go rzucić na właściwy typ?

Odpowiedz

12

Spróbuj tak:

SELECT somestuff 
FROM mytable 
WHERE thetimestamp = ANY (%(times)s::timestamp[]) 
3

Jeśli używasz wersji 2.2.0 psycopg2 lub nowsza, oryginalny kod powinien działać, jeśli owinąć wartości w Timestamp() konstruktorów, jak pan sugeruje.

Powodem, dla którego nie działało wcześniej, był błąd w implementacji psycopg2. Sugerowanym rozwiązaniem było wstawienie jawnych rzutów do kodu SQL, co sugeruje inna odpowiedź.

Powiązane problemy