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 similar a SQL '%' y que parece arrojar 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.
python
postgresql
sqlalchemy
Homunculus Reticulli
fuente
fuente
executeSql(...)
? Y también, ¿realmente tienesRETURNING *
en laSELECT
declaración?Respuestas:
Tienes que dar
%%
para usarlo%
porque%
en python se usa como formato de cadena, por lo que cuando escribes solo se%
supone que vas a reemplazar algún valor con esto.Entonces, cuando desee colocar single
%
en una cadena con consulta, coloque double%
.fuente
SQLAlchemy tiene una
text()
función para ajustar el texto que parece escapar correctamente del SQL por usted.Es decir
debería funcionar para usted y evitar que tenga que hacer el escape manual.
fuente
No puedo encontrar el "executeSql" en los documentos de la versión 1.2 de sqlalchemy , pero la línea siguiente funcionó para mí
fuente
Parece que su problema puede estar relacionado con este error .
En cuyo caso, debe escapar tres veces como solución alternativa.
fuente
Encontré un caso más cuando aparece este error:
En otras palabras, si proporciona el parámetro (
%s
) en la consulta, pero olvida agregar parámetros de consulta. En este caso, el mensaje de error es muy engañoso.fuente
Una nota más: también debe escapar (o eliminar)
%
caracteres en los comentarios. Lamentablemente,sqlalchemy.text(query_string)
no escapa a los signos de porcentaje en los comentarios.fuente
Otra forma de resolver su problema, si no quiere escapar de los
%
caracteres o usarlossqlalchemy.text()
, es usar una expresión regular.En vez de:
Prueba (para coincidencias entre mayúsculas y minúsculas):
o (para mayúsculas y minúsculas):
Ambos
LIKE
y regex están cubiertos en la documentación sobre coincidencia de patrones .Tenga en cuenta que:
Para un ancla, puede usar la aserción
$
para el final de la cadena (o^
para comenzar).fuente
Esto también podría resultar del caso: en caso de que los parámetros que se pasan al SQL se declaren en formato DICT y se manipulen en el SQL en forma de LIST o TUPPLE.
fuente