"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como resolver problemas de substituição de parâmetros no SQLite ao usar sequências versus strings?

Como resolver problemas de substituição de parâmetros no SQLite ao usar sequências versus strings?

Publicado em 2024-11-08
Navegar:654

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

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.

Declaração de lançamento Este artigo foi reimpresso em: 1729322897 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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