文字列補間の使用にリテラル値を入れたくない-SQLインジェクション攻撃は良いことではありません 。代わりに、データベースに関連するプレースホルダー構文を使用します(MySQLは'%s'だと思います)。
注:私は.format
を使用しています ここで、必要に応じて%を使用するように変更しますが、%はエスケープします
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'
cur
を想定 クエリを実行する正しい方法はDBカーソルです:
cur.execute(sql, d.values())
これが機能するのは、辞書の順序は事実上任意の順序ですが、dictのキー/値の順序はdict(zip(d.keys(), d.values())) == d
。