0

dictを使用して、条件、キーの数、値を次のように固定していません

dict = {}
dict['v1'] = 'abc'
dict['v2'] = 123
...
dict['vn'] = xxx

私のSQL形式は

select * from tablename where v1 = 'abc' and v2 = 123 and ... vn = xxx

私は最初にこのようにSQLを変えようとしました:

sql = "select * from tablename where v1 = %s and v2 = %s and ... vn = %s"

以下の形式は、SQL インジェクションを回避できます。質問は、値の数、この準備済みステートメントの書き方がわからないことです。前もって感謝します。

cursor.execute(sql, dict[v1], dict[v2], ..., dict[vn])

4

3 に答える 3

1

やり過ぎかもしれませんが、優れたSqlAlchemyライブラリを使用できます。

from sqlalchemy.sql import select
from sqlalchemy import create_engine, MetaData, Table
engine = create_engine('mysql://your_connection_string')
meta = MetaData()
table = Table('table_name', meta, autoload=True, autoload_with=engine)
s = select([table])
for key, val in dict.items():
   s = s.where(getattr(table.c, key)==val)
for row in conn.execute(s):
    print row

Python で大量の SQL を実行する予定がある場合は、価値があるかもしれません。

http://docs.sqlalchemy.org/en/latest/core/tutorial.html

于 2013-04-08T16:17:35.643 に答える
0

以下が機能するはずです。

sql = 'select * from tablename where ' + ' and '.join(k + ' = %s' for k in data)
cursor.execute(sql, tuple(data.values()))

文字列を作成してsqlからステートメントを実行するまでの間に辞書を変更しないでください。変更すると順序が変わる可能性があります。

dict の名前を に変更したことに注意してください。組み込み型がマスクされるため、変数名としてdata使用しないでください。dict

タプルへの変換が必要かどうかは完全にはわかりません。

于 2013-04-08T16:10:15.857 に答える