7 votes

Python et MySQLdb : substitution de table entraînant une erreur de syntaxe

Je dois changer dynamiquement les tables et les variables de temps en temps, j'ai donc écrit une méthode Python comme ceci :

    selectQ ="""SELECT * FROM  %s WHERE %s = %s;""" 
    self.db.execute(selectQ,(self.table,self.columnSpecName,idKey,))
    return self.db.store_result()

Cependant, cela entraîne une exception d'erreur de syntaxe. J'ai essayé de le déboguer en imprimant les variables dans la méthode et en les remplissant manuellement, et cela a fonctionné. Je ne suis donc pas sûr de ce que je fais mal ?

Est-ce parce que j'essaie d'utiliser un substitut pour une table ?

Aussi, comment puis-je déboguer mysqldb pour qu'il imprime la requête substituée sous forme de chaîne ?

12voto

Daniel Roseman Points 199743

La substitution de paramètres dans l'API DB ne concerne que les valeurs - pas les tables ou les champs. Vous devrez utiliser une substitution de chaîne normale pour ceux-ci :

selectQ ="""SELECT * FROM  %s WHERE %s = %%s;""" % (self.table,self.columnSpecName)
self.db.execute(selectQ,(idKey,))
return self.db.store_result()

Remarquez que le marqueur de position de la valeur a un double % - c'est pour qu'il soit laissé tel quel par la substitution de chaîne initiale.

1voto

Peter Rogers Points 11

Voici un exemple complet de travail

def rtnwkpr(tick, table, col):

    import MySQLdb as mdb
    tickwild = tick + '%'       
    try:
        con = mdb.connect(host, user, password, db);
        cur = con.cursor()
        selectq = "SELECT price FROM %s WHERE %s LIKE %%s;" % (table, col)
        cur.execute(selectq,(tickwild))
        return cur.fetchall()

0voto

Fredrik Håård Points 780

Vous devrez utiliser la substitution de chaîne pour ajouter les noms de table et de colonne, le pilote ne gérera que les paramètres.

Ed : NM, Daniel a répondu plus rapidement et plus complètement

-3voto

alonisser Points 2257

Avez-vous voulu écrire :

selectQ = """SELECT * FROM %s WHERE %s = %s;""" % (self.table,self.columnSpecName,idKey) #peut-être que idKey devrait être self.idkey ? je ne connais pas le reste du code

self.db.execute(selectQ)

et est-ce juste une erreur avec la mise en forme de la chaîne de caractères ?

Soit dit en passant, pourquoi écrivez-vous du SQL explicite pour ce genre de travail ? Il vaut mieux utiliser l'enchanteur sqlalchemy pour la manipulation du sql en python...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X