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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top