Ich verwende handgefertigtes SQL, um mithilfe von SqlAlchemy Daten aus einer PG-Datenbank abzurufen. Ich versuche eine Abfrage, die den SQL-ähnlichen Operator '%' enthält und SqlAlcjhemy durch eine Schleife zu werfen scheint:
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()
Weiß jemand, was diese irreführende Fehlermeldung verursacht und wie ich sie beheben kann?
[[Bearbeiten]]
Bevor jemand fragt, gibt es nichts Besonderes oder Besonderes an den oben enthaltenen Funktionen. Zum Beispiel ruft die Funktion executeSql () einfach conn.execute (sql) auf und gibt die Ergebnisse zurück. Die Variable conn ist einfach die zuvor hergestellte Verbindung zur Datenbank.
python
postgresql
sqlalchemy
Homunculus Reticulli
quelle
quelle
executeSql(...)
? Und auch, hast du wirklichRETURNING *
in derSELECT
Aussage?Antworten:
Sie müssen angeben
%%
, um es zu verwenden,%
da es%
in Python als Zeichenfolgenformatierung verwendet wird. Wenn Sie also Single schreiben, wird%
davon ausgegangen, dass Sie einen Wert durch diesen ersetzen werden.Wenn Sie also Single
%
in String mit Abfrage platzieren möchten, platzieren Sie immer Double%
.quelle
SQLAlchemy verfügt über eine
text()
Funktion zum Umbrechen von Text, die für Sie scheinbar korrekt aus dem SQL-Code ausgeht.Dh
sollte für Sie arbeiten und Sie vor dem manuellen Entkommen bewahren.
quelle
Ich kann das "executeSql" in den Dokumenten von sqlalchemy Version 1.2 nicht finden , aber die folgende Zeile hat für mich funktioniert
quelle
Es scheint, dass Ihr Problem mit diesem Fehler zusammenhängt .
In diesem Fall sollten Sie als Problemumgehung dreimal entkommen.
quelle
Ich habe einen weiteren Fall gefunden, als dieser Fehler auftritt:
Mit anderen Worten, wenn Sie parameter (
%s
) in der Abfrage angeben, aber vergessen, Abfrageparameter hinzuzufügen. In diesem Fall ist die Fehlermeldung sehr irreführend.quelle
Noch ein Hinweis: Sie müssen auch
%
Zeichen in Kommentaren maskieren (oder löschen) . Entgeht leidersqlalchemy.text(query_string)
nicht den Prozentzeichen in den Kommentaren.quelle
Eine andere Möglichkeit, Ihr Problem zu lösen , besteht darin, einen regulären Ausdruck zu verwenden , wenn Sie
%
Zeichen nicht entkommen oder verwenden möchtensqlalchemy.text()
.Anstatt:
Versuchen Sie (für Übereinstimmungen zwischen Groß- und Kleinschreibung):
oder (ohne Berücksichtigung der Groß- und Kleinschreibung):
Sowohl
LIKE
als auch Regex werden in der Dokumentation zum Mustervergleich behandelt .Beachten Sie, dass:
Für einen Anker können Sie die Zusicherung
$
für das Ende der Zeichenfolge (oder^
für den Anfang) verwenden.quelle
Dies könnte auch aus dem Fall resultieren - falls Parameter, die an SQL übergeben werden sollen, im DICT-Format deklariert und in SQL in Form von LIST oder TUPPLE bearbeitet werden.
quelle