Melaksanakan "SELECT ... WHERE ... IN ..." menggunakan MySQLdb
Walaupun berjaya melaksanakan pertanyaan SQL daripada baris arahan MySQL, anda mungkin menghadapi masalah melaksanakan pertanyaan dengan sintaks "WHERE ... IN ..." dari dalam Python menggunakan MySQLdb. Mari kita siasat masalah dan teroka penyelesaian.
Dalam kes anda, anda tidak dapat mendapatkan semula baris dengan pertanyaan yang menapis lajur "bar" dengan klausa "IN", manakala pertanyaan serupa yang menapis " lajur fooid" dengan "IN" berjaya. Ketidakkonsistenan ini boleh dikaitkan dengan cara MySQLdb mengendalikan pertanyaan berparameter.
Apabila anda menentukan tatasusunan nilai sebagai argumen kepada MySQLdb, ia secara automatik menukarnya menjadi tuple rentetan dengan petikan tunggal, mengakibatkan sintaks yang salah untuk klausa "IN". Sebagai contoh, kod anda menukar ['A','C'] kepada ("'A'","'C'").
args=[['A','C']]
Untuk menyelesaikannya, anda mesti membina rentetan SQL secara manual dan menggunakan Python untuk menggabungkan nilai dalam klausa "IN":
<code class="python">args=['A', 'C'] sql='SELECT fooid FROM foo WHERE bar IN (%s)' in_p=', '.join(list(map(lambda x: '%s', args))) sql = sql % in_p cursor.execute(sql, args)</code>
Sebagai alternatif, untuk Python 2, anda boleh menggunakan kod berikut:
<code class="python">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)</code>
Kod ini menjana rentetan SQL secara dinamik dengan bilangan ruang letak yang betul ('%s') dengan mengulangi nilai dalam tatasusunan dan mencantumkannya dengan koma. Dengan melaksanakan pertanyaan yang dibina secara manual ini, anda akan memperoleh hasil yang diharapkan, memilih fooids di mana lajur "bar" berada dalam ('A','C')
Atas ialah kandungan terperinci Mengapakah \'PILIH ... DI MANA ... DI ...\' Pertanyaan Gagal dalam MySQLdb?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!