2012-02-22 7 views
5

ho bisogno di cambiare dinamicamente le tabelle e le variabili di volta in volta, così ho scritto un metodo di pitone come questo:Python e MySQLdb: sostituzione di tavolo con conseguente errore di sintassi

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

Tuttavia questo si traduce in un errore di sintassi eccezione. Ho provato il debugging, quindi ho stampato le variabili nel metodo e le ho riempite manualmente, e questo ha funzionato. Quindi non sono sicuro di cosa sto sbagliando?

È perché provo a usare un sostituto per un tavolo?

Inoltre, come faccio a eseguire il debug di mysqldb in modo che stampi la query sostituita come una stringa?

risposta

10

La sostituzione dei parametri nell'API DB è solo per valori, non per tabelle o campi. Avrete bisogno di usare il normale sostituzione di stringhe per chi:

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

Nota che il valore segnaposto ha un doppio % - questo è così che è lasciato solo dalla sostituzione stringa iniziale.

+0

Se ho capito bene che sostituirà il% s con una stringa e sarà solo lasciare un % di %% s? –

+0

Sì, è corretto. –

+0

grazie mille :) –

-3

Forse intendevi scrivere:

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) 

e questo è solo un errore con la formattazione di stringhe?

Perché si scrive SQL esplicito per questo tipo di lavoro? meglio usare il magico sqlalchemy per la manipolazione python sql ..

0

Dovrai utilizzare la sostituzione di stringhe per aggiungere i nomi di tabella e colonna, il driver gestirà solo i parametri.

Ed: NM, Daniel ha risposto velocemente e più completamente

1

Ecco un esempio di lavoro completo

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()   
+0

def inswk (tabella, totale, data, tick): importa MySQLdb come mdb import sys con = None prova: con = mdb.connect (host, utente, password, db); cur = con.cursor() selectq = "" "INSERT INTO% s (prezzo, data, ticker) VALORI (%% s, %% s, %% s)" ""% (table) cur.execute (selectq, (totale, data, segno di spunta))) –

Problemi correlati