Saya menggunakan SQL buatan tangan untuk mengambil data dari database PG, menggunakan SqlAlchemy. Saya mencoba kueri yang berisi operator seperti SQL '%' dan yang tampaknya melempar SqlAlcjhemy melalui loop:
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()
Adakah yang tahu apa yang menyebabkan pesan kesalahan yang menyesatkan ini dan bagaimana saya dapat memperbaikinya?
[[Sunting]]
Sebelum ada yang bertanya, tidak ada yang istimewa atau mewah tentang fungsi yang disertakan di atas. Sebagai contoh, fungsi executeSql () cukup memanggil conn.execute (sql) dan mengembalikan hasilnya. Sambungan variabel hanyalah koneksi yang sebelumnya dibuat ke database.
python
postgresql
sqlalchemy
Homunculus Reticulli
sumber
sumber
executeSql(...)
? Dan juga, apakah Anda benar-benar adaRETURNING *
dalamSELECT
pernyataan itu?Jawaban:
Anda harus memberi
%%
untuk menggunakannya%
karena%
dalam python digunakan sebagai pemformatan string sehingga ketika Anda menulis tunggal%
asumsikan bahwa Anda akan mengganti beberapa nilai dengan ini.Jadi, ketika Anda ingin menempatkan tunggal
%
dalam string dengan kueri allways place double%
.sumber
SQLAlchemy memiliki
text()
fungsi untuk membungkus teks yang tampaknya lolos dari SQL untuk Anda.Yaitu
harus bekerja untuk Anda dan menyelamatkan Anda dari keharusan melakukan penyelamatan manual.
sumber
Saya tidak dapat menemukan "executeSql" di sqlalchemy versi 1.2 docs , tetapi baris di bawah ini berfungsi untuk saya
sumber
Sepertinya masalah Anda mungkin terkait dengan bug ini .
Dalam hal ini, Anda harus melarikan diri tiga kali lipat sebagai solusinya.
sumber
Saya menemukan satu lagi kasus ketika kesalahan ini muncul:
Dengan kata lain, jika Anda memberikan parameter (
%s
) dalam kueri, tetapi Anda lupa menambahkan params kueri. Dalam hal ini pesan kesalahan sangat menyesatkan.sumber
Satu lagi catatan - Anda harus melarikan diri (atau menghapus)
%
karakter dalam komentar juga. Sayangnya,sqlalchemy.text(query_string)
tidak luput dari tanda persen di komentar.sumber
Cara lain untuk menyelesaikan masalah Anda, jika Anda tidak ingin keluar dari
%
karakter atau menggunakansqlalchemy.text()
, adalah dengan menggunakan ekspresi reguler.Dari pada:
Coba (untuk pencocokan case-sensitive):
atau (untuk case-insensitive):
Baik
LIKE
dan regex tercakup dalam dokumentasi tentang pencocokan pola .Perhatikan bahwa:
Untuk jangkar, Anda dapat menggunakan pernyataan
$
untuk akhir string (atau^
untuk awal).sumber
Ini juga bisa dihasilkan dari kasus - dalam hal parameter yang akan diteruskan ke SQL dideklarasikan dalam format DICT dan sedang dimanipulasi dalam SQL dalam bentuk LIST atau TUPPLE.
sumber