Używam ręcznie spreparowanego języka SQL do pobierania danych z bazy danych PG przy użyciu SqlAlchemy. Próbuję zapytać, które zawiera operator podobny do SQL „%” i wydaje się, że SqlAlcjhemy przechodzi przez pętlę:
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()
Czy ktoś wie, co powoduje ten mylący komunikat o błędzie i jak mogę to naprawić?
[[Edytować]]
Zanim ktoś zapyta, nie ma nic specjalnego ani wyszukanego w funkcjach opisanych powyżej. Na przykład funkcja executeSql () po prostu wywołuje conn.execute (sql) i zwraca wyniki. Zmienna conn to po prostu wcześniej nawiązane połączenie z bazą danych.
python
postgresql
sqlalchemy
Homunculus Reticulli
źródło
źródło
executeSql(...)
? A także, czy naprawdę masz toRETURNING *
wSELECT
oświadczeniu?Odpowiedzi:
Musisz dać,
%%
aby go używać,%
ponieważ%
w pythonie jest używane jako formatowanie ciągów, więc kiedy piszesz single,%
zakłada się, że zamierzasz zastąpić jakąś wartość tą wartością.Więc jeśli chcesz umieścić pojedynczy
%
w ciągu za pomocą zapytania, zawsze umieszczaj double%
.źródło
SQLAlchemy ma
text()
funkcję zawijania tekstu, która wydaje się prawidłowo uciec przed SQL.To znaczy
powinien zadziałać dla Ciebie i uchronić Cię przed koniecznością wykonywania ręcznej ucieczki.
źródło
Nie mogę znaleźć "executeSql" w dokumentacji sqlalchemy w wersji 1.2 , ale poniższa linia działała dla mnie
źródło
Wygląda na to, że Twój problem może być związany z tym błędem .
W takim przypadku należy użyć potrójnej zmiany znaczenia jako obejścia.
źródło
Znalazłem jeszcze jeden przypadek, gdy pojawia się ten błąd:
Innymi słowy, jeśli podasz parametr (
%s
) w zapytaniu, ale zapomnisz dodać parametry zapytania. W tym przypadku komunikat o błędzie jest bardzo mylący.źródło
Jeszcze jedna uwaga - musisz też uciec (lub usunąć)
%
znaki w komentarzach. Niestetysqlalchemy.text(query_string)
nie umknie znakom procentu w komentarzach.źródło
Innym sposobem rozwiązania problemu, jeśli nie chcesz zmieniać znaczenia
%
znaków lub ich używaćsqlalchemy.text()
, jest użycie wyrażenia regularnego.Zamiast:
Spróbuj (dla dopasowania z rozróżnianiem wielkości liter):
lub (bez rozróżniania wielkości liter):
LIKE
W dokumentacji dotyczącej dopasowywania wzorców omówiono zarówno wyrażenia regularne, jak i wyrażenia regularne .Zauważ, że:
W przypadku kotwicy możesz użyć potwierdzenia
$
na końcu łańcucha (lub^
na początku).źródło
Może to również wynikać z przypadku - w przypadku, gdy parametry, które mają być przekazane do SQL, są zadeklarowane w formacie DICT i są przetwarzane w SQL w postaci LISTY lub TUPPLE.
źródło