【发布时间】:2018-09-27 23:42:45
【问题描述】:
我一直在寻找加快将数据帧推送到 sql server 的方法,偶然发现了一种方法 here. 这种方法在速度方面让我大吃一惊。使用普通的to_sql 花了将近 2 个小时,这个脚本在 12.54 秒内完成,以推送 100k 行 X 100 列 df。
因此,在使用示例 df 测试下面的代码后,我尝试使用具有许多不同数据类型(int、string、floats、Booleans)的 df。但是,看到内存错误,我很难过。所以我开始减小我的 df 的大小,看看有什么限制。我注意到如果我的 df 有任何字符串,那么我无法加载到 sql server。我无法进一步隔离问题。下面的脚本取自链接中的问题,但是,我添加了一个带有字符串的小 df。任何有关如何纠正此问题的建议都会很棒!
import pandas as pd
import numpy as np
import time
from sqlalchemy import create_engine, event
from urllib.parse import quote_plus
import pyodbc
conn = "DRIVER={SQL Server};SERVER=SERVER_IP;DATABASE=DB_NAME;UID=USER_ID;PWD=PWD"
quoted = quote_plus(conn)
new_con = 'mssql+pyodbc:///?odbc_connect={}'.format(quoted)
engine = create_engine(new_con)
@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
print("FUNC call")
if executemany:
cursor.fast_executemany = True
table_name = 'fast_executemany_test'
df1 = pd.DataFrame({'col1':['tyrefdg','ertyreg','efdgfdg'],
'col2':['tydfggfdgrefdg','erdfgfdgfdgfdgtyreg','edfgfdgdfgdffdgfdg']
})
s = time.time()
df1.to_sql(table_name, engine, if_exists = 'replace', chunksize = None)
print(time.time() - s)
【问题讨论】:
标签: python sql-server pandas sqlalchemy pyodbc