Python und MySQLdb: Ersetzen der Tabelle führt zu Syntaxfehlern
-
29-10-2019 - |
Frage
Ich muss Tabellen und Variablen von Zeit zu Zeit dynamisch ändern, deshalb habe ich eine Python-Methode wie die folgende geschrieben:
selectQ ="""SELECT * FROM %s WHERE %s = %s;"""
self.db.execute(selectQ,(self.table,self.columnSpecName,idKey,))
return self.db.store_result()
Dies führt jedoch zu einer Syntaxfehlerausnahme.Ich habe versucht, es zu debuggen, also habe ich die Variablen in der Methode gedruckt und manuell ausgefüllt, und das hat funktioniert.Ich bin mir also nicht sicher, was ich falsch mache?
Liegt es daran, dass ich versuche, einen Ersatz für eine Tabelle zu verwenden?
Wie debugge ich auch mysqldb, damit die ersetzte Abfrage als Zeichenfolge gedruckt wird?
Lösung
Die Parametersubstitution in der DB-API gilt nur für Werte - nicht für Tabellen oder Felder.Sie müssen die normale Zeichenfolgenersetzung verwenden für:
selectQ ="""SELECT * FROM %s WHERE %s = %%s;""" % (self.table,self.columnSpecName)
self.db.execute(selectQ,(idKey,))
return self.db.store_result()
Beachten Sie, dass der Platzhalter für den Wert einen doppelten %
hat - dies ist so, dass er durch die anfängliche Zeichenfolgenersetzung in Ruhe gelassen wird.
Andere Tipps
Hier ist ein voll funktionsfähiges Beispiel
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()
Sie müssen eine Zeichenfolgenersetzung verwenden, um die Tabellen- und Spaltennamen hinzuzufügen. Der Treiber verarbeitet nur Parameter.
Ed: NM, Daniel antwortete schneller und vollständiger
Wollten Sie schreiben:
selectQ = """SELECT * FROM %s WHERE %s = %s;""" % (self.table,self.columnSpecName,idKey) #maybe the idkey should be self.idkey? don't know the rest of the code
self.db.execute(selectQ)
und dies ist nur ein Fehler bei der Formatierung von Zeichenfolgen?
Übrigens, warum schreiben Sie explizites SQL für diese Art von Arbeit?Verwenden Sie besser die magische sqlalchemy für die Manipulation von Python-SQL.