Você não quer colocar valores literais usando interpolação de string - ataques de injeção de SQL não são uma boa coisa (tm) . Em vez disso, você usa a sintaxe de espaço reservado relevante para seu banco de dados (acho que o MySQL é '%s').
Observação:estou usando
.format
aqui, mude para usar % se quiser, mas escape qualquer %'s 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'
Assumindo
cur
é um cursor de banco de dados a maneira correta de realizar a consulta é:cur.execute(sql, d.values())
Isso funciona porque, embora a ordenação de um dicionário seja efetivamente uma ordem arbitrária, a ordem das chaves/valores de um dict será consistente de modo que
dict(zip(d.keys(), d.values())) == d
.