python sqlite3 cursor.execute () con parámetros conduce al error de sintaxis cerca? (ParamStyle Qmark)

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

Pregunta

Después de buscar una locura, decidí publicar una pregunta aquí. Intento crear una base de datos SQLITE3 donde me gustaría hacer uso de la función de sustitución de variable segura de la función Cursor.Execute (SQL, Param). Mi función es así:

#!/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()

Sé que el primer argumento debe ser el comando SQL en forma de una cadena y el segundo argumento debe ser una tupla de los valores que se supone que deben ser sustituidos donde el? está en la cadena SQL. Sin embargo, cuando ejecuto el archivo devuelve el siguiente error:

$ ./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

Esto también sucede cuando se establece paramStyle en el nombre (por ejemplo, el formulario: tabla). No puedo detectar un error de sintaxis aquí, así que creo que el problema debe ser causado en algún lugar del sistema. Lo probé en una instalación de Archlinux y Debian, ambos publican el mismo error.

Ahora te está yendo, ya que ya no tengo idea de dónde buscar la causa.

¿Fue útil?

Solución

Los parámetros SQL solo pueden aplicarse a insertar datos, no nombres de la tabla. Eso significa que los parámetros ni siquiera se analizan para las declaraciones DDL.

Para eso tendrá que usar el formato de cadena:

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

Otros consejos

Según tengo entendido, ¿su parámetro es el nombre de la tabla?

Entonces tu comando sería

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top