Rumah  >  Artikel  >  pangkalan data  >  Mengapakah \"PILIH ... DI MANA ... DI ...\" Pertanyaan Gagal dalam MySQLdb?

Mengapakah \"PILIH ... DI MANA ... DI ...\" Pertanyaan Gagal dalam MySQLdb?

Barbara Streisand
Barbara Streisandasal
2024-11-01 17:32:02798semak imbas

Why is

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn