Bersarang senarai dalam klausa IN dalam Python MySQL
P粉781235689
P粉781235689 2023-08-22 17:04:59
0
2
488
<p>Saya tahu cara memetakan senarai kepada rentetan: </p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>Saya tahu saya boleh meletakkan rentetan itu ke dalam klausa IN menggunakan: </p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>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. </p> <p> (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.) </p>
P粉781235689
P粉781235689

membalas semua(2)
P粉434996845

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

ids = [5, 3, ...]  # id列表
cursor.execute('''
SELECT 
...
WHERE
  id IN %(ids)s
  AND created_at > %(start_dt)s
''', {
  'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
})

Diuji dan lulus di bawah python2.7pymysql==0.7.11

P粉212114661

Guna teruslist_of_ids:

format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                tuple(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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan