5

複数の行を MySQL データベースに挿入したり、ファイルに保存したりするために使用できる変数を生成しようとしています。

私はPythonを初めて使用するので、学ばなければならないすべての新しい概念で頭がいっぱいになり、私のアプローチが良いものであるという少しの安心を探しています。

複数の項目をテーブルに挿入するための SQL 構文は次のとおりです。

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

これは私が持っているコードです:

import shelve

shelf = shelve.open('test.db', flag='r')

sql = "INSERT INTO 'myTableName' ( "
sql += ", ".join(shelf.itervalues().next())
sql = " ) VALUES "
for s in shelf: 

  sql += "( "
  sql += ', '.join(['\'%s\'' % ( value ) for (key, value) in shelf[s].items()])
  sql += " ),"

shelf.close()

print sql

それはほぼ機能します(最後のSQL追加で ; の代わりに末尾に ; があります)が、もっと簡潔なアプローチが必要だと確信しています。それが何であるか教えてもらえますか?

4

2 に答える 2

7

文字列連結から SQL を生成しないでください。代わりに SQL パラメータを使用します。

cursor = connection.cursor()

cursor.executemany('INSERT INTO 'tablename' ('column1', 'column2') VALUES (%s, %s)',
        [sub.values() for sub in shelf.values()])

その後、データベースはステートメントを再利用INSERTでき(クエリ プランを準備します)、データベース クライアント レイヤーが引用を処理し、SQL インジェクション攻撃の起動を防ぎます。

于 2013-02-05T16:24:05.030 に答える