2016-05-03 47 views
5

pythonスクリプトでは、あるデータソースに対してクエリを実行し、そのクエリの各行を別のデータソースのテーブルに挿入する必要があります。私は通常、単一の挿入/選択ステートメントをtsqlリンクサーバーの結合でこれを行うだろうが、私はこの特定のデータソースへのリンクサーバー接続がありません。基本pyodbc一括挿入

これの簡単なpyodbcの例を見つけるのに問題があります。ここで私はそれを行う方法ですが、ループ内でのinsert文の実行はかなり遅いと推測しています。

result = ds1Cursor.execute(selectSql) 

for row in result: 
    insertSql = "insert into TableName (Col1, Col2, Col3) values (?, ?, ?)" 
    ds2Cursor.execute(insertSql, row[0], row[1], row[2]) 
    ds2Cursor.commit() 

pyodbcでレコードを挿入する方法はありますか?とにかくこれを行うには、これは比較的効率的な方法です。私はSqlServer 2012と最新のpyodbcとpythonのバージョンを使用しています。

答えて

7

これを処理する最善の方法は、pyodbc関数executemanyを使用することです。

ds1Cursor.execute(selectSql) 
result = ds1Cursor.fetchall() 


ds2Cursor.executemany('INSERT INTO [TableName] (Col1, Col2, Col3) VALUES (?, ?, ?)', result) 
ds2Cursor.commit() 
+8

executemanyは実際にはバルク挿入を実際に行っていません。現場の裏側では、インサート1を1で実行しています。実際には、データをよりpython的にソース化できるラッパーです。このSOの投稿は、適切な一括挿入を提示します。 http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – casbby

4

SQL Serverデータベースに一括挿入できる機能は次のとおりです。

import pypyodbc 
import contextlib 

def bulk_insert(table_name, file_path): 
    string = "BULK INSERT {} FROM '{}' (WITH FORMAT = 'CSV');" 
    with contextlib.closing(pypyodbc.connect("MYCONN")) as conn: 
     with contextlib.closing(conn.cursor()) as cursor: 
      cursor.execute(string.format(table_name, file_path)) 
     conn.commit() 
     conn.close() 

これは間違いなく機能します。更新のために、pyodbcの代わりにpypyodbcを使用する方が良いです。

+1

これは正しい答えですが、そのように受け入れられるべきである。 executemanyメソッドは、一括挿入の速度に代わるものではありません。注意してください。SQL Server自体のファイルではなくイテレータから一括挿入を実行する場合は、ctdsドライバはオプションです。 https://pypi.python.org/pypi/ctds/ – Kerr

+0

あなたが提供したリンクをチェックアウトしただけです。私はそれが本当に良いようだと思う。試してみよう。ありがとう。 – Naufal