Python Sqlite3 Cursor.Execute () avec des paramètres conduit à une erreur de syntaxe près? (Paramstyle Qmark)

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

Question

Après avoir cherché jusqu'à la folie, j'ai décidé de poster une question ici. J'essaie de créer une base de données SQLite3 où je voudrais utiliser la fonction de substitution de variable sécurisée de la fonction cursor.exécute (SQL, PARAM). Ma fonction va comme ceci:

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

Je sais que le premier argument devrait être la commande SQL sous forme d'une chaîne et que le deuxième argument doit être un tuple des valeurs qui sont censées être substituées où le? est dans la chaîne SQL. Cependant, lorsque j'exécute le fichier, il renvoie l'erreur suivante:

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

Cela se produit également lorsque Paramstyle est défini sur le nom (par exemple le formulaire de table). Je ne peux pas repérer une erreur de syntaxe ici, donc je pense que le problème doit être causé quelque part dans le système. Je l'ai testé sur une installation Archlinux et Debian, les deux me publient la même erreur.

Maintenant, c'est de vous, car je ne sais plus où chercher la cause.

Était-ce utile?

La solution

Les paramètres SQL ne peuvent s'appliquer qu'à l'insertion Les données, pas des noms de table. Cela signifie que les paramètres ne sont même pas analysés pour les instructions DDL.

Pour cela, vous devrez utiliser le formatage des chaînes:

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

Autres conseils

Si je comprends bien, votre paramètre est le nom de la table?

Alors ta commande serait

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top