2009-12-30 15 views
9

Vorrei eseguire una query PostgreSQL in Python utilizzando psycopg2, che filtra per una colonna di tipo timestamp without timezone. Ho una lunga lista di valori consentiti per il timestamp (piuttosto che una gamma) e psycopg2 gestisce comodamente array, così ho pensato che questo dovrebbe funzionare:Come specificare il parametro psycopg2 per un array per timestamps (datetimes)

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

Il parametro times è una lista di oggetti datetime. Ho anche provato psycopg2.Timestamp(). Entrambi si traduce in WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]) e, purtroppo, che non riesce con il seguente errore:

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. 

Ho confermato questo pgAdmin pure, quindi non è solo psycopg2. Quello che sembra accadere è che Postgres non converte implicitamente una serie di stringhe in una matrice di timestamp. Converte una stringa singola e l'array funziona correttamente se aggiungo esplicitamente ::timestamp a ciascun elemento in pgAdmin, ma non so come farlo in psycopg2.

Qual è il modo migliore per farlo, oltre a dimenticare i parametri DB-API e la semplice creazione della lunga stringa di timestamp manualmente? C'è un modo in cui posso farlo per trasmettere al tipo corretto?

risposta

12

Prova in questo modo:

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

Se si utilizza la versione 2.2.0 psycopg2 o più recente, il codice originale dovrebbe funzionare, se si avvolgono i valori in Timestamp() costruttori, come lei ha suggerito.

Il motivo per cui non funzionava prima era un bug nell'implementazione di psycopg2. La soluzione suggerita consisteva nell'inserire i cast espliciti nell'SQL, come suggerito in un'altra risposta.

Problemi correlati