Vous ne voulez pas mettre de valeurs littérales en utilisant l'interpolation de chaîne - les attaques par injection SQL ne sont pas une bonne chose(tm) . Au lieu de cela, vous utilisez la syntaxe d'espace réservé pertinente pour votre base de données (je pense que MySQL est '%s').
Remarque :J'utilise .format
ici, changez pour utiliser % si vous le souhaitez, mais échappez tous les %
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'
En supposant cur
est un curseur de base de données, la manière correcte d'effectuer la requête est :
cur.execute(sql, d.values())
Cela fonctionne car bien que l'ordre d'un dictionnaire soit effectivement un ordre arbitraire, l'ordre des clés/valeurs d'un dict sera cohérent de sorte que dict(zip(d.keys(), d.values())) == d
.