web-dev-qa-db-ja.com

基本的なpyodbc一括挿入

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バージョン。

12
Zip184

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

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


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

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よりも適切にサポートされていることを、定期的にコーディングするだけでなく、コメントで気付きました。

9
Naufal