Saya tahu cara memetakan senarai kepada rentetan:
foostring = ",".join( map(str, list_of_ids) )
Saya tahu saya boleh meletakkan rentetan itu ke dalam klausa IN menggunakan:
cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))
Saya perlu melaksanakan fungsi yang sama dalam pangkalan data MySQL dengan cara yang selamat (mengelakkan suntikan SQL). Dalam contoh di atas, kerana footstring tidak diluluskan sebagai parameter untuk dilaksanakan, ia terdedah. Saya juga perlu membuat petikan dan melarikan diri di luar perpustakaan MySQL.
(Terdapat soalan SO yang berkaitan, tetapi jawapan yang disenaraikan di sana sama ada tidak berfungsi dengan pangkalan data MySQL atau terdedah kepada serangan suntikan SQL.)
Walaupun soalan ini sudah lama, saya ingin meninggalkan jawapan sekiranya orang lain turut mencari apa yang saya cari
Jawapan yang diterima menjadi mengelirukan apabila kita mempunyai banyak parameter atau ingin menggunakan parameter bernama
Selepas beberapa percubaan
Diuji dan lulus di bawah
python2.7
和pymysql==0.7.11
Guna terus
list_of_ids
:Dengan cara ini anda boleh mengelak daripada memetik sendiri dan mengelakkan pelbagai masalah suntikan SQL.
Perhatikan bahawa data (
list_of_ids
) dihantar terus kepada pemacu mysql sebagai parameter (bukan dalam teks pertanyaan), jadi tiada isu suntikan. Anda boleh menyimpan sebarang aksara dalam rentetan tanpa mengalih keluar atau memetik aksara.