pythonスクリプトでは、1つのデータソースでクエリを実行し、そのクエリの各行を別のデータソースのテーブルに挿入する必要があります。通常、単一の挿入/選択でこれを行いますtsqlリンクサーバーへの参加を伴うステートメントですが、この特定のデータソースへのリンクサーバー接続がありません。
この簡単なpyodbcの例を見つけるのに問題があります。ここに私がそれをする方法がありますが、ループ内で挿入ステートメントを実行するとかなり遅いと思います。
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バージョン。
これを処理する最良の方法は、pyodbc関数executemany
を使用することです。
ds1Cursor.execute(selectSql)
result = ds1Cursor.fetchall()
ds2Cursor.executemany('INSERT INTO [TableName] (Col1, Col2, Col3) VALUES (?, ?, ?)', result)
ds2Cursor.commit()
SQL Serverデータベースへの一括挿入を実行できる関数を次に示します。
import pyodbc
import contextlib
def bulk_insert(table_name, file_path):
string = "BULK INSERT {} FROM '{}' (WITH FORMAT = 'CSV');"
with contextlib.closing(pyodbc.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よりも適切にサポートされていることを、定期的にコーディングするだけでなく、コメントで気付きました。