Solucionando problemas de substituição de parâmetros no SQLite
Encontrando problemas ao utilizar a substituição de parâmetros no SQLite3 com Python? Aqui está uma investigação aprofundada e uma resolução.
Na tentativa de evitar injeções de SQL, substituição de parâmetros usando '?' é aconselhável. No entanto, pode surgir um erro ao utilizar esta abordagem. Por exemplo, com o seguinte código:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
Ocorre o erro "sqlite3.ProgrammingError: Número incorreto de ligações fornecidas", indicando que a instrução especifica uma ligação, enquanto oito são fornecidas. Esse problema decorre da criação inicial da tabela do banco de dados. O módulo responsável pela criação do banco de dados contém oito vinculações, o que leva à incompatibilidade.
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)""")
Ironicamente, substituindo '?' com um '%s' menos seguro resolve o problema:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
A razão por trás desse paradoxo está na maneira como Cursor.execute() aceita seu segundo parâmetro. Em vez de uma única string, ele espera uma sequência, mas você está passando uma string de comprimento oito.
Para corrigir esse problema, ajuste o código para o seguinte:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Esta modificação garante que a substituição do parâmetro funcione conforme o esperado. Certifique-se sempre de que o segundo parâmetro passado para Cursor.execute() corresponde ao número especificado de ligações na instrução SQL.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3