2010-10-15 12 views
5

Attualmente sto tentando di cercare un database per afferrare determinati eventi. La mia domanda è, come talePsycopg2 utilizza caratteri jolly TypeError

SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > '2010-10-01' 

In poche parole ho bisogno della query per guardare attraverso un database di eventi di calendario e restituire qualche cosa con un riassunto con 'test' in essa e dopo l'inizio di questo mese.

Questo restituisce i risultati previsti quando richiesto dalla riga di comando del database. Tuttavia quando tento di usare nel mio script Python con psycopg2 in quanto tale:

cursor.execute("SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > %(begin)s ", {'begin' : datetime.datetime(2010,10,1) }) 

ottengo un errore di tipo

*** TypeError: 'dict' object does not support indexing 

Facendo qualche iniziale Googling suona come qualcosa con il modo in cui sto usando i miei jolly Potrei sbagliarmi e probabilmente mi manca qualcosa di semplice che non vedo. Speriamo che un nuovo paio di occhi della community possa correggere il mio niente di niente;)

risposta

14

Non sono sicuro se questa sia la radice completa del problema, ma penso che sia necessario sfuggire ai caratteri jolly o la logica di parametrizzazione si confonderà.

SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s 

Penso %% è la fuga giusta, ma potrebbe essere \%

+0

Hm che lo risolve. Ma non credo che questo sia il problema alla radice da quando ho provato per un capriccio di eliminare il dizionario e di eseguire semplicemente la linea senza sostituzione per vedere se il carattere jolly non fosse effettivamente scappato a destra. Liberarsi del dizionario ha funzionato così perché ho bisogno di sfuggire al carattere jolly quando viene utilizzato un dizionario? –

+0

La sostituzione del parametro sottostante utilizza '%' come carattere speciale che significa 'hey, sostituisci un valore dal mio dettato qui'. La mia ipotesi è che se non si passa il dict, questa logica di parametrizzazione viene saltata interamente, quindi non c'è possibilità che venga confusa dalla presenza di '%' nella clausola where. In altre parole, è probabile che soffochi * in * il passo di parametrizzazione che non stai più facendo. Quindi, se passi dei parametri devi sfuggire al carattere% speciale, altrimenti no. –

+0

Ok, questo ha senso. Grazie Signore! –

3

la mia ipotesi è qualcosa del tuo "%" 's confonde pitone. in psycopg2 faccio il mio jolly "come" le query in questo modo:


#!/usr/bin/python 

import sys,os.path,psycopg2 
db=psycopg2.connect("dbname=music") 

for line in sys.argv[1::]: 
    cursor=db.cursor() 
    key="%"+line+"%" 
    cursor.execute("select count(*) from pool where path like %s",(key,)) 
    if cursor.fetchone()[0] != 1: 
     sys.stderr.write("ambiguous stem or no such song") 
     sys.exit(-1) 
    cursor.execute("insert into spool select path from pool where path like %s",(key,)) 
    cursor.close() 
    db.commit() 
db.close() 

con stringhe di ricerca forniti dall'utente come in questo script si sarebbe probabilmente vuole sfuggire qualsiasi "%" 's in loro, che ho il sospetto sarebbe in caso contrario, si tratta di caratteri jolly legittimi nella query, ma non ho ancora raggiunto il limite