TypeError: Tidak Semua Argumen Ditukar Semasa Pemformatan Rentetan dalam Pertanyaan SQL Berparameter
Menghadapi ralat "TypeError: bukan semua argumen ditukar semasa pemformatan rentetan " apabila menggunakan rentetan dalam pertanyaan SQL berparameter adalah perkara biasa isu.
Contoh kod yang disediakan:
cur.execute("SELECT * FROM records WHERE email LIKE '%s'", search)
cuba untuk melaksanakan pertanyaan dengan rentetan yang diformatkan dengan pemegang tempat (%s) untuk parameter carian. Walau bagaimanapun, kaedah ini tidak betul.
Untuk menyelesaikan ralat ini, cara yang betul untuk melaksanakan pertanyaan berparameter adalah dengan menyediakan nilai pemegang tempat sebagai senarai:
cur.execute("SELECT * FROM records WHERE email LIKE %s", [search])
Dalam kes ini, [ carian] ialah senarai yang mengandungi parameter carian tunggal. MySQLdb (dan perpustakaan pangkalan data lain yang serupa) mengharapkan senarai nilai untuk ditukar dan diformatkan. Melepasi nilai tunggal secara langsung akan mengakibatkan ralat.
Alasan di sebalik ini ialah pertanyaan berparameter boleh mengandungi berbilang ruang letak dalam pernyataan SQL, setiap satu mewakili nilai yang berbeza. Dengan menyediakan nilai sebagai senarai, pustaka pangkalan data boleh mengulangi senarai dan menukar setiap nilai dengan sewajarnya.
Oleh itu, apabila menggunakan ruang letak dalam pertanyaan SQL berparameter, adalah penting untuk menyediakan nilai sebagai senarai atau tuple . Ini memastikan bahawa semua argumen ditukar dan diformat dengan betul, menghalang ralat "tidak semua argumen ditukar".
Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Berparameter Saya Melemparkan Ralat 'TypeError: Tidak Semua Argumen Ditukar'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!