我遇到了使用pyodbc和fastexecutemany将数据推送到MSSQL表的问题。
我已经在Stackoverflow上搜索了互联网和其他帖子。据我所知,我做的很好,但是加载失败。
我要尝试推送一个简单的数据框。看起来像这样:
Date A B C D
2018-01-03 2.0 1.0 1.0 Joe
2018-01-04 2.0 1.0 2.0 Joe
2018-01-05 2.0 3.0 1.0 Pete
2018-01-06 2.0 1.0 5.0 Mary
...
日期是日期时间。数字是浮点数。名称是字符串
我正在尝试加载到Microsoft SQL 2016数据库
代码如下:
conn = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=192.168.123.45;DATABASE=' + database + ';UID=xx;PWD=yyyyy'
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
df.to_sql(name=table, con=engine, if_exists=action, index=False, chunksize=None)
我收到以下错误:
sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY010', u'[HY010] [Microsoft][ODBC Driver 17 for SQL Server]Function sequence error (0) (SQLParamData)')
我在数据集中有一些空值。我将它们更改为None
,还更改为字符串('NA'
)。没有运气。
如果我删除了装饰器并打开了执行功能,那么它会正确执行,但是由于它使用的是熊猫to_sql
,所以执行速度很慢。
有人有见识吗?
谢谢。
使用:
Windows 10专业版 Anaconda Python 2.7 PyODBC 4.0.25
答案 0 :(得分:0)
“ to_sql”中的表名参数区分大小写。我为此浪费了很长时间,因为我以前在sql server中不使用区分大小写的内容。