1

MySQLdbパッケージを使用して、Pythonを介してMySQLテーブルを更新しようとしています。

この形式の辞書からのデータで特定のテーブルを更新したいと思います。

muts={'YES': [rice,bread,pasta]
       'NO': [sweets,fat,milk,choco]} 

リストの各エントリに対応する列food値(上記のディクショナリの値)を持つmysqlテーブルの行の場合、呼び出される別の列acceptが対応するキーで更新される必要があります。'はい、もしくは、いいえ'。

これまで、単一のリストを使用してテーブルからエントリを更新したい場合、私は次のことを行うために使用します。

food=[sweets,fat,milk,choco]
sql = "UPDATE test2 g SET accept='NO' WHERE g.food IN (%s)"
to_add = ', '.join(list(map(lambda x: '%s', any_list)))
sql = sql % to_add
cursor.execute(sql, any_list)

しかし今、私は辞書からのキー値で同時に更新したいと思います。迷子になりました。

4

1 に答える 1

2

2つの%sを使用してSQLを定義し、to_add行のディクショナリをループして、とを配置しkますto_add

>>> muts={'YES': ['rice','bread','pasta'],
...        'NO': ['sweets', 'fat', 'milk', 'choco']}
>>> muts
{'YES': ['rice', 'bread', 'pasta'], 'NO': ['sweets', 'fat', 'milk', 'choco']}
>>> sql = "UPDATE test2 g SET accept='%s' WHERE g.food IN (%s)"
>>> for k in muts:
...     to_add = ', '.join(muts[k])
...     ex_sql = sql % (k, to_add)
...     print ex_sql
...     # cursor.execute(ex_sql) here
... 
UPDATE test2 g SET accept='YES' WHERE g.food IN (rice, bread, pasta)
UPDATE test2 g SET accept='NO' WHERE g.food IN (sweets, fat, milk, choco)
>>> 

これを関数に入れて、「any_list」を渡すことができます。.execute( , any_list)executeがステートメントのリストを取得しない限り、 inを1行で使用することはできません。

ところで、結合線は実際には次のようになります。

to_add = "'%s'" % "', '".join(muts[k])

そのため、'各食品タイプを引用符で囲むことになります。

... # that gives...
UPDATE test2 g SET accept='YES' WHERE g.food IN ('rice', 'bread', 'pasta')
UPDATE test2 g SET accept='NO' WHERE g.food IN ('sweets', 'fat', 'milk', 'choco')

SQLインジェクション攻撃を回避する?代わりに、プレースホルダー構文を使用することもできます。%s

于 2012-08-09T09:20:09.860 に答える