Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menyelesaikan Isu Penggantian Parameter dalam SQLite Apabila Menggunakan Urutan vs. Rentetan?
Menyelesaikan Masalah Penggantian Parameter dalam SQLite
Menghadapi isu semasa menggunakan penggantian parameter dalam SQLite3 dengan Python? Berikut ialah penyiasatan dan penyelesaian yang mendalam.
Dalam percubaan untuk menghalang suntikan SQL, penggantian parameter menggunakan '?' adalah dinasihatkan. Walau bagaimanapun, ralat mungkin timbul apabila menggunakan pendekatan ini. Contohnya, dengan kod berikut:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close()</code>
Ralat "sqlite3.ProgrammingError: Bilangan pengikatan yang tidak betul yang dibekalkan" berlaku, menunjukkan bahawa pernyataan itu menentukan satu pengikatan, manakala lapan disediakan. Isu ini berpunca daripada penciptaan awal jadual pangkalan data. Modul yang bertanggungjawab untuk penciptaan pangkalan data mengandungi lapan pengikatan, yang membawa kepada ketidakpadanan.
<code class="python">cursor.execute("""CREATE TABLE Equipment (id INTEGER PRIMARY KEY, name TEXT, price INTEGER, weight REAL, info TEXT, ammo_cap INTEGER, availability_west TEXT, availability_east TEXT)""")</code>
Ironinya, menggantikan '?' dengan '%s' yang kurang selamat menyelesaikan masalah:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close()</code>
Sebab di sebalik paradoks ini terletak pada cara Cursor.execute() menerima parameter keduanya. Daripada rentetan tunggal, ia menjangkakan urutan, tetapi anda melepasi rentetan panjang lapan.
Untuk membetulkan isu ini, laraskan kod kepada yang berikut:
<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
Pengubahsuaian ini memastikan bahawa penggantian parameter berfungsi seperti yang dimaksudkan. Sentiasa pastikan bahawa parameter kedua dihantar ke Cursor.execute() sepadan dengan bilangan pengikatan yang ditentukan dalam pernyataan SQL.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Isu Penggantian Parameter dalam SQLite Apabila Menggunakan Urutan vs. Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!