Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menyelesaikan Isu Penggantian Parameter dalam SQLite Apabila Menggunakan Urutan vs. Rentetan?

Bagaimana untuk Menyelesaikan Isu Penggantian Parameter dalam SQLite Apabila Menggunakan Urutan vs. Rentetan?

DDD
DDDasal
2024-10-19 15:28:30565semak imbas

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

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!

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