J'utilise SQL fabriqué à la main pour récupérer des données à partir d'une base de données PG, en utilisant SqlAlchemy. J'essaie une requête qui contient le SQL comme l'opérateur '%' et qui semble lancer SqlAlcjhemy à travers une boucle:
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()
Quelqu'un sait ce qui cause ce message d'erreur trompeur et comment je peux le réparer?
[[Éditer]]
Avant que quiconque ne demande, il n'y a rien de spécial ou de fantaisie dans les fonctions incluses ci-dessus. Par exemple, la fonction executeSql () appelle simplement conn.execute (sql) et renvoie les résultats. La variable conn est simplement la connexion précédemment établie à la base de données.
python
postgresql
sqlalchemy
Homunculus reticulli
la source
la source
executeSql(...)
? Et aussi, avez-vous vraimentRETURNING *
dans laSELECT
déclaration?Réponses:
Vous devez donner
%%
pour l'utiliser%
car%
en python est utilisé comme formatage de chaîne, donc lorsque vous écrivez un single,%
il suppose que vous allez remplacer une valeur par ceci.Ainsi, lorsque vous souhaitez placer un simple
%
dans une chaîne avec une requête, placez toujours le double%
.la source
SQLAlchemy a une
text()
fonction pour envelopper le texte qui semble échapper correctement au SQL pour vous.C'est à dire
devrait fonctionner pour vous et vous éviter d'avoir à faire l'échappement manuel.
la source
Je ne trouve pas le "executeSql" dans la documentation de sqlalchemy version 1.2 , mais la ligne ci-dessous a fonctionné pour moi
la source
Il semble que votre problème soit lié à ce bogue .
Dans ce cas, vous devez triple-échapper pour contourner le problème.
la source
J'ai trouvé un autre cas lorsque cette erreur apparaît:
En d'autres termes, si vous fournissez le paramètre (
%s
) dans la requête, mais que vous oubliez d'ajouter des paramètres de requête. Dans ce cas, le message d'erreur est très trompeur.la source
Une dernière remarque: vous devez également échapper (ou supprimer) des
%
caractères dans les commentaires. Malheureusement,sqlalchemy.text(query_string)
n'échappe pas aux signes de pourcentage dans les commentaires.la source
Une autre façon de résoudre votre problème, si vous ne voulez pas échapper
%
ou utiliser des caractèressqlalchemy.text()
, est d'utiliser une expression régulière.Au lieu de:
Essayez (pour une correspondance sensible à la casse):
ou (pour insensible à la casse):
Les deux
LIKE
et regex sont traités dans la documentation sur la correspondance de modèles .Notez que:
Pour une ancre, vous pouvez utiliser l'assertion
$
pour la fin de la chaîne (ou^
pour le début).la source
Cela pourrait également résulter du cas - dans le cas où les paramètres à passer au SQL sont déclarés au format DICT et sont manipulés dans le SQL sous la forme de LISTE ou TUPPLE.
la source