without tutorial postgres not mssql create_engine create python postgresql sqlalchemy

python - tutorial - sqlalchemy mssql



Mensaje de error Strange SQLAlchemy: TypeError: el objeto ''dict'' no admite la indexación (7)

Estoy usando SQL hecho a mano para obtener datos de una base de datos PG, usando SqlAlchemy. Estoy intentando una consulta que contiene el operador SQL like ''%'' 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 ''%'' i.e. 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 o elegante sobre 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.


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

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

En otras palabras, si proporciona un 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.


Esto también podría ser el resultado 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.


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

engine.execute(sqlalchemy.text(sql_query))


Parece que tu problema puede estar relacionado con este error .

En ese caso, debe escapar triple como una solución alternativa.


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

es decir

res = executeSql(sqlalchemy.text(sql))

debería funcionar para usted y evitarle tener que hacer el extraño escape.


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

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


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