基本的pyodbc批量插入

Zip*_*184 15 python sql-server pyodbc

在python脚本中,我需要在一个数据源上运行查询,并将该查询中的每一行插入到不同数据源的表中.我通常使用带有tsql链接服务器连接的单个insert/select语句来执行此操作,但是我没有与此特定数据源的链接服务器连接.

我找不到一个简单的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()
Run Code Online (Sandbox Code Playgroud)

使用pyodbc插入记录有更好的批量方式吗?或者这是一种相对有效的方法来做到这一点.我正在使用SqlServer 2012,以及最新的pyodbc和python版本.

Leg*_*ude 15

处理此问题的最佳方法是使用pyodbc函数executemany.

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


ds2Cursor.executemany('INSERT INTO [TableName] (Col1, Col2, Col3) VALUES (?, ?, ?)', result)
ds2Cursor.commit()
Run Code Online (Sandbox Code Playgroud)

  • 只是一个注释,executemany实际上并没有真正的bulkinsert.在场景的后面,它仍然使用1进行插入.它确实是一个允许数据更加蟒蛇化的包装器.这个SO帖子提供了一个合适的bulkinsert.http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv (16认同)
  • pyodbc 版本 4.0.19 及更高版本有一个 `fast_executemany` 选项,可以大大加快速度。有关详细信息,请参阅[此答案](/sf/answers/3294003261/)。 (2认同)

Nau*_*fal 10

这是一个可以批量插入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()
Run Code Online (Sandbox Code Playgroud)

这绝对有效.

更新:我已经注意到评论以及定期编码,pyodbc比pypyodbc更好地支持.

  • 这是正确的答案,应该被接受.executemany方法不能代替批量插入的速度.值得注意的是,如果要从迭代器而不是SQL Server本身的文件执行批量插入,则可以选择ctds驱动程序.https://pypi.python.org/pypi/ctds/ (5认同)
  • 这要求您的 SQL 实例在拉入该文件时有权访问该文件。通过实现对 SQL 的批量复制将其推送到您的数据库可能更可取。https://github.com/Azure/azure-sqldb-spark (2认同)