带有fast_executemany的Python MSSQL PyODBC失败

时间:2019-02-07 21:00:24

标签: python sql-server pyodbc

我遇到了使用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

1 个答案:

答案 0 :(得分:0)

“ to_sql”中的表名参数区分大小写。我为此浪费了很长时间,因为我以前在sql server中不使用区分大小写的内容。