python sqlite3 cursor.execute() com parâmetros leva a um erro de sintaxe próximo?(paramstyle qmark)

StackOverflow https://stackoverflow.com/questions/19843668

Pergunta

depois de pesquisar até a loucura, resolvi postar uma pergunta aqui.Tento criar um banco de dados sqlite3 onde gostaria de usar a função de substituição de variável segura da função cursor.execute(SQL, param).Minha função é assim:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sqlite3

def create():
    values = ("data")
    sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"

    con = sqlite3.connect("database.db")
    c = con.cursor()
    c.execute(sql, values)
    con.commit()
    c.close()
    con.close()

if __name__ = "__main__":
    create()

Eu sei que o primeiro argumento deve ser o comando sql na forma de uma string e o segundo argumento deve ser uma tupla dos valores que devem ser substituídos onde o ?está na string sql.Porém, quando executo o arquivo ele retorna o seguinte erro:

$ ./test.py 

Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    create()
  File "./test.py", line 14, in create
    c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error

Isso também acontece quando paramstyle é definido como nomeado (por exemplo,o formato :table).Não consigo identificar um erro de sintaxe aqui, então acho que o problema deve ser causado em algum lugar do sistema.Eu testei em uma instalação do Archlinux e do Debian, ambos postaram o mesmo erro.

Agora é com você, pois não tenho mais ideia de onde procurar a causa.

Foi útil?

Solução

Os parâmetros SQL só podem ser aplicados à inserção dados, não nomes de tabelas.Isso significa que os parâmetros nem sequer são analisados ​​para instruções DDL.

Para isso você terá que usar a formatação de string:

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)

Outras dicas

Pelo que entendi, seu parâmetro é o nome da tabela?

Então seu comando seria

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top