Nie chcesz wprowadzać wartości dosłownych przy użyciu interpolacji ciągów — ataki typu SQL injection nie są dobrą rzeczą(tm) . Zamiast tego użyj składni zastępczej odpowiedniej dla Twojej bazy danych (myślę, że MySQL to '%s').
Uwaga:używam pliku .format
tutaj zmień, aby użyć %, jeśli chcesz, ale pomiń wszystkie %
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'
Zakładając, że cur
jest kursorem bazy danych, prawidłowym sposobem wykonania zapytania jest:
cur.execute(sql, d.values())
Działa to, ponieważ chociaż kolejność słownika jest w rzeczywistości arbitralna, kolejność kluczy/wartości dyktatu będzie spójna, tak że dict(zip(d.keys(), d.values())) == d
.