2011-12-28 7 views
56

Estoy utilizando SQL hecho a mano para obtener datos de una base de datos PG, utilizando SqlAlchemy. Estoy tratando una consulta SQL que contiene el operador como '%' y que parece arrojar SqlAlcjhemy través de un bucle:Mensaje de error Strange SQLAlchemy: TypeError: el objeto 'dict' no es compatible con la indexación

sql = """ 
     SELECT DISTINCT u.name from user u 
     INNER JOIN city c ON u.city_id = c.id 
     WHERE c.designation=upper('fantasy') 
     AND c.id IN (select id from ref_geog where short_name LIKE '%opt') 
     """ 

# The last line in the above statement throws the error mentioned in the title. 
# However if the last line is change to: 
# AND c.id IN (select id from ref_geog where short_name = 'helloopt') 
# the script runs correctly. 
# 
# I also tried double escaping the '%' i.e. using '%%' instead - that generated the same error as previously. 

connectDb() 
res = executeSql(sql) 
print res 
closeDbConnection() 

Cualquiera sabe lo que está causando este mensaje de error equivocado y cómo puedo solucionarlo?

[[Editar]]

Antes cualquiera pregunta, no hay nada especial o de fantasía acerca de las funciones incluidas anteriormente. Por ejemplo, la función executeSql() simplemente invoca conn.execute (sql) y devuelve los resultados. La variable conn es simplemente la conexión previamente establecida a la base de datos.

+0

puede publicar el código de 'executeSql (...)'? Y también, ¿realmente tienes 'RETURNING *' en la instrucción 'SELECT'? – van

+0

@van Me perdí esa. No hay 'DEVOLUCIÓN *' en el SQL que está causando el problema. Voy a corregir la pregunta. –

+1

es útil esta respuesta [http://stackoverflow.com/questions/3944276/psycopg2-using-wildcard-causes-typeerror]? – van

Respuesta

4

Parece que su problema puede estar relacionado con this bug.

En cuyo caso, debe triple escape como una solución.

91

usted tiene que dar %% utilizarlo como % porque % en Python es su uso como formato de cadenas por lo que cuando se escribe sola % su asuma que va a sustituir a algún valor con esto.

Por lo tanto, cuando desea colocar solo % en cadena con consulta siempre coloque doble %.

+3

Desearía que actualizaran ese mensaje de error, cada vez que lo consigo termino aterrizando en esta página y respondo – oshi2016

28

SQLAlchemy tiene una función de texto para ajustar el texto que parece escapar correctamente del SQL por usted.

decir

res = executeSql(sqlalchemy.text(sql)) 

debe trabajar para usted y lo libera de tener que hacer el escape extraña.

+2

Esta debería ser la respuesta seleccionada. Solucionó el problema en mi caso. –

+0

Tenga en cuenta que esto no escapa a los comentarios, pero de lo contrario es una solución fantástica. – ClimbsRocks

0

Esto también podría resultar del caso, en el caso de que los parámetros que se pasen al SQL se declaren en formato DICT y se manipulen en el SQL en forma de LIST o TUPPLE.

1

me encontré con un caso más cuando este error aparece:

c.execute("SELECT * FROM t WHERE a = %s") 

En otras palabras, si usted proporciona parámetros (%s) en la consulta, pero se olvida de añadir Parámetros de consulta. En este caso, el mensaje de error es muy engañoso.

0

Una nota más: debe escapar (o eliminar) los caracteres % en los comentarios también. Lamentablemente, sqlalchemy.text(query_string) no escapa a los signos de porcentaje en los comentarios.

Cuestiones relacionadas