加速Python executemany

时间:2016-03-15 16:36:35

标签: sql python-3.x odbc pypyodbc

我正在将数据从一个数据库插入另一个数据库,因此我有2个连接(Conn1和Conn2)。下面是代码(使用pypyodbc)。

 import pypyodbc

 Conn1_Query = "SELECT column FROM Table"

 Conn1_Cursor.execute(Conn1_Query)
 Conn1_Data = Conn1_Cursor.fetchall()

 Conn1_array = []

 for row in Conn1_Data:
      Conn1_array.append(row)

上述部分运行得很快。

 stmt = "INSERT INTO TABLE(column) values (?)"
 Conn2_Cursor.executemany(stmt, Conn1_array)
 Conn2.commit()

这部分非常慢。我还尝试使用cursor.execute一次执行for循环以插入每一行,但这也非常慢。我做错了什么,有什么办法可以加快速度吗?谢谢你看看。

以为我还应该补充说Conn1数据只有~50k行。我在开头还有一些我没有包含的设置代码,因为它与问题无关。插入大约需要15分钟。作为比较,将输出写入csv文件大约需要25秒。

1 个答案:

答案 0 :(得分:0)

是的,pypyodbc下的executemany为每一行发送单独的INSERT语句。它的作用与在循环中进行单独的execute调用相同。鉴于pypyodbc不再处于积极开发中,这不太可能改变。

但是,如果您使用兼容的驱动程序(例如“ SQL Server的ODBC驱动程序xx”)并切换到pyodbc,则可以使用其fast_executemany选项来显着加快插入速度。有关更多详细信息,请参见this answer