2009-01-23 6 views
1

Je pense que je suis être un crétin, peut-être pas importer le bon paquet, mais quand je fais ...Python pysqlite ne pas accepter mon paramétrage qmark


from pysqlite2 import dbapi2 as sqlite 
import types 
import re 
import sys 
... 
    def create_asgn(self): 
     stmt = "CREATE TABLE ? (login CHAR(8) PRIMARY KEY NOT NULL, grade INTEGER NOT NULL)" 
     stmt2 = "insert into asgn values ('?', ?)" 
     self.cursor.execute(stmt, (sys.argv[2],)) 
     self.cursor.execute(stmt2, [sys.argv[2], sys.argv[3]]) 
... 
 I get the error pysqlite2.dbapi2.OperationalError: near "?": syntax error

Cela me semble très peu de sens, comme les docs montre que pysqlite est qmark paramétré. Je suis nouveau sur python et db-api, aidez-moi! MERCI

Répondre

7

En effet, les paramètres ne peuvent être transmis qu'à VALUES. Le nom de la table ne peut pas être paramétré.

Vous avez également des guillemets autour d'un argument paramétré sur la deuxième requête. Supprimez les citations, l'échappement est géré par la bibliothèque de soulignement automatiquement pour vous.

2

Essayez de supprimer les guillemets dans la ligne qui attribue à stmt2:

stmt2 = "insert into asgn values (?, ?)" 

De plus, comme le dit nosklo, vous ne pouvez pas utiliser paramétrisation point d'interrogation avec les instructions CREATE TABLE. Collez le nom de la table dans le SQL directement.

1

Si vous voulez vraiment faire, essayer quelque chose comme ceci:

lire def (db = « projets »):

sql = "select * from %s" 
sql = sql % db 
c.execute(sql) 
+0

si je dois le faire, est-il une fonction, je peux faire pour échapper db d'abord ??? – Overflown

+0

utiliser la forme backtick des noms de table dans le SQL (ie: \ 'table \' au lieu de table) et faire une fonction remove_backticks (inputString) qui retourne inputString avec tous les backticks supprimés. Puis écrivez la requête ci-dessus (puisque vous avez fourni cet exemple) en tant que telle: 'sql =" SELECT * from \ '% s \' "% remove_backticks (db)' –

Questions connexes