10

キーがデータベースフィールドであり、そのフィールドに入るデータが辞書でそれに関連付けられている値である辞書から更新するための再利用可能なmysqlステートメントを作成しようとしています。mysql に挿入するための関数を作成する場合、2 つのリストが含まれているだけなので、これは簡単でした。ここで、リストを分割する必要があります。

これが私が取り組まなければならないものです。

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

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

これは、次のようなステートメントを出力します。

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

次のようなテーブルを更新するために標準形式に出力する必要があります。

UPDATE table_name SET column1=value1, column2=value2
4

2 に答える 2

18

文字列補間を使用してリテラル値を入れたくない - SQL インジェクション攻撃は良いこと (tm) ではありません。代わりに、データベースに関連するプレースホルダー構文を使用します (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'

が DB カーソルであると仮定するcurと、クエリを実行する正しい方法は次のとおりです。

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

ディクショナリの順序は事実上任意の順序ですが、辞書のキー/値の順序は一貫しているため、これは機能しますdict(zip(d.keys(), d.values())) == d

于 2012-07-17T07:17:15.817 に答える
0

試してみてはどうですか

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

stmt = stmt[-2:]
于 2012-07-17T07:19:12.650 に答える