Mensaje de error Strange SQLAlchemy: TypeError: el objeto ‘dict’ no admite la indexación

Estoy utilizando SQL creado a mano para recuperar datos de una base de datos PG, usando SqlAlchemy. Estoy intentando una consulta que contiene el operador SQL como ‘%’ y que parece lanzar SqlAlcjhemy a través de un bucle:

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 '%' ie using '%%' instead - that generated the same error as previously. connectDb() res = executeSql(sql) print res closeDbConnection() 

¿Alguien sabe qué está causando este mensaje de error engañoso y cómo puedo solucionarlo?

[[Editar]]

Antes de que alguien pregunte, no hay nada especial ni elegante en las funciones incluidas arriba. 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.

Tienes que dar %% para usarlo como % porque % en python se usa como formato de cadena, de modo que cuando escribes un solo % asume que vas a reemplazar algún valor con esto.

Entonces, cuando quiera colocar un solo % en la cadena con la consulta, siempre coloque el doble % .

SQLAlchemy tiene una función de text() para envolver el texto que parece escapar correctamente del SQL para usted.

Es decir

 res = executeSql(sqlalchemy.text(sql)) 

debería trabajar para usted y evitarle tener que hacer el escape manual.

Parece que tu problema puede estar relacionado con este error .

En cuyo caso, debe triplicar el escape como solución alternativa.

No puedo encontrar el “executeSql” en los documentos de la versión 1.2 de sqlalchemy, pero la siguiente línea funcionó para mí

 engine.execute(sqlalchemy.text(sql_query)) 

Encontré un caso más cuando aparece este error:

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

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

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

Esto también podría deberse al caso, en 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 LISTA o TUPPLE.