2010-10-15 8 views
5

Actualmente estoy intentando buscar en una base de datos para capturar ciertos eventos. Mi consulta es, como tal,Psycopg2 usando el comodín causa TypeError

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

En pocas palabras necesito la consulta a mirar a través de una base de datos de eventos de calendario y devolver cualquier cosa con un resumen con la 'prueba' en ella y después del comienzo de este mes.

Esto devuelve los resultados esperados cuando se consulta desde la línea de comandos de la base de datos. Sin embargo cuando intento usarlo en mi script en Python con psycopg2 como tal:

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

me sale un error de tipo

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

Haciendo un poco de googlear inicial suena como algo con la forma en que estoy usando mis comodines. Sin embargo, podría estar equivocado y probablemente me esté perdiendo algo simple que no veo. Esperemos que un par de ojos frescos de la comunidad puedan corregir mi noobishness;)

Respuesta

14

No estoy seguro de si esta es la raíz completa de su problema, pero creo que debe escapar sus comodines o la lógica de parametrización se confundirá.

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

creo %% es el escape correcta, pero podría ser \%

+0

Hm que soluciona eso. Pero no creo que ese sea el problema raíz, ya que intenté librarme del diccionario y simplemente ejecutar la línea sin sustitución para ver si el comodín no se estaba escapando bien. Deshacerse del diccionario funcionó, entonces ¿por qué necesito escapar del comodín cuando se usa un diccionario? –

+0

La sustitución de los parámetros subyacentes usa '%' como un carácter especial que significa 'hey, sustituye un valor de mi dict aquí'. Supongo que si no pasas el dict, esta lógica de parametrización se omite por completo, por lo que no hay posibilidad de que se confunda por la presencia de '%' en tu cláusula where. En otras palabras, es probable que asfixie * en * el paso de parametrización que ya no está haciendo. Entonces, si está pasando parámetros, necesita escapar del carácter% especial, de lo contrario no. –

+0

Bien, eso tiene sentido. ¡Gracias Señor! –

3

yo creo que es algo acerca de su "%" 's es confundir pitón. en psycopg2 hago mi comodín "como" consultas de la siguiente manera:


#!/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 cadenas de búsqueda proporcionados por el usuario, como en este guión es probable que quiera escapar de cualquier "%" 's en ellos, y sospecho que lo haría de lo contrario, serian comodines legítimos en la consulta, pero aún no he llegado tan lejos