Python SQLite3 Cursor.execute () con parametri porta all'errore di sintassi vicino? (Paramstyle Qmark)

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

Domanda

Dopo aver cercato fino a quando la follia, ho deciso di pubblicare una domanda qui. Cerco di creare un database SQLite3 in cui vorrei utilizzare la funzione di sostituzione variabile sicura della funzione Cursor.Execute (SQL, Param). La mia funzione va così:

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

So che il primo argomento dovrebbe essere il comando SQL sotto forma di una stringa e il secondo argomento deve essere una tupla dei valori che dovrebbero essere sostituiti dove? è nella stringa SQL. Tuttavia, quando eseguo il file restituisce il seguente errore:

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

Ciò accade anche quando ParamStyle è impostato su denominato (ad esempio il modulo: tabella). Non riesco a individuare un errore di sintassi qui, quindi penso che il problema debba essere causato da qualche parte nel sistema. L'ho testato su un archlinux e debian installazione, entrambi pubblicano lo stesso errore.

Ora è su di te, poiché non ho più idea di dove cercare la causa.

È stato utile?

Soluzione

I parametri SQL possono applicarsi solo per l'inserto dati, non nomi di tabelle. Ciò significa che i parametri non sono nemmeno analizzati per le istruzioni DDL.

Per questo dovrai usare la formattazione delle stringhe:

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

Altri suggerimenti

Come ho capito, il tuo parametro è il nome della tabella?

Quindi il tuo comando sarebbe

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top