Rumah  >  Soal Jawab  >  teks badan

Bersarang senarai dalam klausa IN dalam Python MySQL

<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粉781235689P粉781235689424 hari yang lalu456

membalas semua(2)saya akan balas

  • P粉434996845

    P粉4349968452023-08-23 15:50:40

    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

    balas
    0
  • P粉212114661

    P粉2121146612023-08-23 00:26:09

    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.

    balas
    0
  • Batalbalas