2012-07-17 12 views
6

Sto cercando di creare un'istruzione mysql riutilizzabile per l'aggiornamento da un dizionario in cui le chiavi sono i campi del database e i dati da inserire in quel campo sono il valore associato ad esso nel dizionario. Questo è stato facile quando si creava una funzione per l'inserimento in mysql perché implicava solo due elenchi. Ora, ho bisogno di rompere le liste.Come aggiornare mysql con python dove i campi e le voci provengono da un dizionario?

Ecco quello con cui devo lavorare.

fields = self.dictionary.keys() 
vals = self.dictionary.values() 

stmt = "UPDATE TABLE table_name SET %s = '%s'" %(.join(fields), .join(vals))" 

Questo genera una dichiarazione come:

UPDATE TABLE table_name SET column1, column2 = ('value1','value2') 

ho bisogno di output in formato standard per l'aggiornamento una tabella come:

UPDATE table_name SET column1=value1, column2=value2 

risposta

8

non si vuole per essere messa letterale valori nell'utilizzo dell'interpolazione di stringhe - Gli attacchi di SQL injection sono non una buona cosa (tm). Invece, si utilizza la sintassi del segnaposto rilevante per il proprio database (penso che MySQL sia '% s').

Nota: sto usando .format qui, cambiare per usare% se si vuole, ma la fuga 's qualsiasi%

d = {'col1': 'val1', 'col2': 'val2'} 
sql = 'UPDATE table SET {}'.format(', '.join('{}=%s'.format(k) for k in d)) 
print sql 
# 'UPDATE table SET col2=%s, col1=%s' 

Supponendo cur è un cursore DB il modo corretto per eseguire la query è :

cur.execute(sql, d.values()) 

Questo funziona perché anche se l'ordine di un dizionario è effettivamente ordine arbitrario, l'ordine di chiavi/valori di un dict sarà coerente tale che dict(zip(d.keys(), d.values())) == d.

0

ne dite di provare

stmt = "UPDATE TABLE table_name SET " 
for k,v in di.items(): 
    stmt += "%s = %s, " %(k,v) 

stmt = stmt[-2:] 
Problemi correlati