2017-04-18 13 views
2

私はPythonの初心者ですので、私が見つけたものからスクリプトをハッキングしていて、うまくいっています(一番上品でないまたは修正する)。私の最終的な目標は、csvをとり、それを読んで、段階を見つけ、そのフレーズが見つかった場合にその行をSQL​​データベースに書き込むことです。私はこの作業を持っていますが、私の質問はこれです:Python SQLの1つのコミット対複数のコミットを使用

私は(私が今やっているされているもの)withのすべてのループの内側.execute()、その後.commit()を書くべきか?あるいは、私は単一のステートメントを作成し、最後に実行/コミットする必要があります(これを行う方法がわからない場合)。私はthis postを読んで、インサートをどのようにフォーマットするのか見ていますが、私のコードをどうやって取得するのかは分かりません。どのような助けやアドバイスが最初の方法はちょうど良いまたは適切な方法は、2番目の方法は素晴らしいだろう!前もって感謝します!

背景:私はpypyodbcとVMを使用しています。 Pythonスクリプトは、SQL Expressデータベースと同じVMにあります。ここで

は私のコードです:

with open(CSVFILE, 'rt', encoding='utf8') as f: 
    if debug: 
     print('Inside the with') 
    reader = csv.reader(f, delimiter=',') 
    columns = next(reader) 
    query = 'insert into TABLENAME ({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    for row in reader: 
     for field in row: 
      if data.strSearch in field: 
       if debug: 
        print('Found: {}'.format(row[0])) 
       cursor.execute(query, row) 
       cursor.commit() 
+0

代わりに、各ループの各「行」を別のリストに追加して、ネストされたリストを与えることができます。すべてのループを終了したら、 'executemany()'を呼び出して 'execute()'の代わりにlist_of_rowsを渡してレコードを一度に挿入し、変更を 'commit()'することができます。しかし、内部ループの各繰り返しでの 'commit()'は厳密には必要ではなく、実行時間を増加させます。 – roganjosh

答えて

1

一つだけが最後にコミットんのでごループの.commit()外に移動することができますが、あなたはそれをやっている方法は、正常に見えます。おそらく少し速いでしょう。

リストに行を追加してから.executemanyを使用すると、ほとんどの場合、別のINSERT文がサーバーに送信されるため、コミットの移動以上のパフォーマンスは向上しませんループの外側にあります。

関連する問題