0

Python で動的 MySQL クエリを実行する適切な方法を誰か教えてもらえますか?

CREATE ステートメントと INSERT ステートメントの両方に対して動的クエリを実行したいと考えています。ここで別の投稿を参照しました:

Python での MySQL 動的クエリ ステートメント

しかし、うまくいきませんでした。

これが私の試みたコードです:

sql="create table %s (%%s, %%s, %%s ... )" % (tablename,''.join(fields)+' '.join(types))
cur.execute(sql)     

ここで、'field' はリストに格納されているフィールド名、'types' はリストに格納されているフィールド タイプです。

4

1 に答える 1

0

MySQLdbPython とDB APIの両方が%s置換を示すために使用していることは、混乱を招く可能性があります。DB API では、主に SQL インジェクション攻撃を回避するために使用されます。ステートメントでは、文字列の置換が必要な場合にcursor.execute()のみ使用する意味があります。%s

例えば。

次の sql を実行します。

CREATE TABLE foo (myfield INTEGER);

いいえ

CREATE TABLE 'foo' ('myfield' INTEGER);

次のようなものが適している可能性があります。

field1_name_and_type = 'myfield VARCHAR(100)'
sql="create table %s (%s)" % (tablename, field1_name_and_type)
cur.execute(sql)

INSERT次に、テーブルに入れたい場合%sは、execute ステートメントで を使用して文字列をエスケープします。

my_malicious_sql = input()
cur.execute('INSERT INTO %s VALUES (%%s)' % tablename, my_malicious_sql)

この例では、 の最初の引数は次のexecute()ように展開されtablename == "foo"ます。

cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)

次に、MySQLdb ライブラリはmy_malicious_sql、SQL インジェクション エラーを回避するために文字列を正しくエスケープし、テキストをデータベース テーブルに挿入します。

于 2013-05-29T07:03:55.950 に答える