Melaksanakan "SELECT ... WHERE ... IN ..." Menggunakan MySQLdb
Dalam Python, melaksanakan pertanyaan SQL yang melibatkan " IN" klausa menggunakan MySQLdb boleh menghadapi cabaran. Pertimbangkan senario berikut:
Masalah:
Percubaan untuk melaksanakan pertanyaan seperti ini:
<code class="sql">SELECT fooid FROM foo WHERE bar IN ('A','C');</code>
dari dalam Python menggunakan kod berikut:
<code class="python">import MySQLdb import config connection=MySQLdb.connect( host=config.HOST,user=config.USER,passwd=config.PASS,db='test') cursor=connection.cursor() sql='SELECT fooid FROM foo WHERE bar IN %s' args=[['A','C']] cursor.execute(sql,args) data=cursor.fetchall() print(data) # ()</code>
menghasilkan set data kosong, walaupun jangkaan dua baris.
Punca:
MySQLdb secara automatik menambah petikan tunggal di sekeliling elemen dalam senarai input berhujah, menyebabkan pertanyaan dilaksanakan sebagai:
<code class="sql">SELECT fooid FROM foo WHERE bar IN ("'A'", "'C'")</code>
Pertanyaan ini berbeza daripada pertanyaan asal yang dimaksudkan, yang menggunakan senarai petikan tunggal.
Penyelesaian:
Untuk mengatasi isu ini, anda mesti membina parameter pertanyaan secara manual. Berikut ialah versi diubah suai kod Python yang menangani masalah:
<code class="python">import MySQLdb import config connection=MySQLdb.connect( host=config.HOST,user=config.USER,passwd=config.PASS,db='test') cursor=connection.cursor() args=['A', 'C'] sql='SELECT fooid FROM foo WHERE bar IN (%s)' in_p=', '.join(map(lambda x: '%s', args)) sql = sql % in_p cursor.execute(sql, args) data=cursor.fetchall() print(data) # (('1',), ('3',))</code>
Dengan membina rentetan in_p menggunakan map() dan menggabungkannya dengan koma, anda mencipta satu siri ruang letak untuk elemen dalam args dengan berkesan. Penggunaan operator % memastikan bahawa pemegang tempat digantikan dengan betul dengan nilai sebenar apabila pertanyaan dilaksanakan.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan \'PILIH ... DI MANA ... DI ...\' Pertanyaan dengan MySQLdb dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!