尽管在 create_engine()

时间:2021-03-08 17:35:33

标签: python sql-server pandas sqlalchemy pyodbc

我有一个场景,我需要在表之间进行批量插入,我配置了我的 sqlalchemy 引擎来做到这一点。我配置为在每个块中进行批量插入( chunksize: 10000 ),但我仍然逐行插入。

destengine = sqlalchemy.create_engine(
               "mssql+pyodbc://"+destuser+":"+destpass+"@"+destaddress+""+destdatabase+"?driver=ODBC+Driver+17+for+SQL+Server", echo=False, fast_executemany = True)

for chunk in pd.read_sql( selectquery, srcconnection, chunksize=100000):
    chunk.to_sql("MyTable", destengine, if_exists='append', index = False )

如上所述,我在连接字符串中选择了 ODBC 驱动程序作为 ODBC 驱动程序 17,我将 fast_executemany 与 true 放在我的引擎中。我究竟做错了什么?我的表有数百万行和 100 多列。我是 Pandas 的新手,但我认为我所做的与示例相同。

1 个答案:

答案 0 :(得分:1)

您发现了一个变体:

fast_executemany ineffective when generator passed to executemany

pandas 文档指出,如果 chunksize= 被传递给 read_sql(),那么它返回一个迭代器而不是一个 DataFrame。我们可以通过将结果提取到一个“真实的”DataFrame 中然后调用 to_sql() 来解决这个问题:

for chunk in pd.read_sql( selectquery, srcconnection, chunksize=10):
    df = pd.DataFrame(chunk.values, columns=chunk.columns)
    df.to_sql("MyTable", destengine, if_exists='append', index = False )