我有一个场景,我需要在表之间进行批量插入,我配置了我的 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 的新手,但我认为我所做的与示例相同。
答案 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 )