python sqlite3 cursor.execute () mit Parametern führt zu einem Syntaxfehler in der Nähe? (Paramstyle Qmark)

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

Frage

Nachdem ich bis zum Wahnsinn gesucht hatte, beschloss ich, hier eine Frage zu stellen. Ich versuche, eine SQLite3 -Datenbank zu erstellen, in der ich die sichere Funktion für variable Substitution der Funktion der Cursor.execute (SQL, Param) verwenden möchte. Meine Funktion lautet so:

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

Ich weiß, dass das erste Argument der SQL -Befehl in Form einer Zeichenfolge sein sollte und das zweite Argument ein Tupel der Werte sein muss, die dort ersetzt werden sollen, wo das? ist in der SQL -Zeichenfolge. Wenn ich jedoch die Datei ausführe, gibt sie den folgenden Fehler zurück:

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

Dies geschieht auch, wenn Paramstyle auf benannt ist (z. B. das: Tabellenformular). Ich kann hier keinen Syntaxfehler erkennen, daher denke ich, dass das Problem irgendwo im System verursacht werden muss. Ich habe es an einer Archlinux- und Debian -Installation getestet, beide posten mir den gleichen Fehler.

Jetzt ist es los, da ich keine Ahnung mehr habe, wo ich nach der Sache suchen soll.

War es hilfreich?

Lösung

SQL -Parameter können nur für Einfügen gelten Daten, keine Tabellennamen. Das bedeutet, dass Parameter nicht einmal für DDL -Anweisungen analysiert werden.

Dafür müssen Sie String -Formatierung verwenden:

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

Andere Tipps

Wie ich verstehe, ist Ihr Parameter der Tabellenname?

Ihr Befehl wäre also

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top