to-sql pyodbc count字段不正确或语法错误

2024-10-01 17:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

将数据从PyAlcY下载到PyAlcY服务器,并将数据插入到PyHemI服务器中。在

我最多可以下载10000行,但是我必须将chunksize限制为10,否则会出现以下错误:

DBAPIError: (pyodbc.Error) ('07002', '[07002] [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error (0) (SQLExecDirectW)') [SQL: 'INSERT INTO [TEMP_producing_entity_details]

大约有5亿行要下载,它只是以这种速度爬行。有什么关于解决办法的建议吗?在

谢谢


Tags: 数据服务器clientsqlservercount错误error
2条回答

更新:

pandas 0.23.1恢复了0.23.0中引入的有问题的更改。但是,对于原始性能的最佳解决方案仍然是CSV->;bcp方法,如下所述。在

更新:

熊猫0.24.0显然重新引入了这个问题(参考文献:here


(原始答案)

在pandas版本0.23.0之前,to_sql将为DataTable中的每一行生成一个单独的INSERT:

exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
    N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
    0,N'row000'
exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
    N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
    1,N'row001'
exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
    N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
    2,N'row002'

大概是为了提高性能,pandas 0.23.0现在生成一个表值构造函数,以便在每次调用中插入多行

^{pr2}$

问题是SQLServer存储过程(包括系统存储过程,如sp_prepexec)被限制为2100个参数,因此,如果DataFrame有100列,to_sql一次只能插入大约20行。在

我们可以使用

# df is an existing DataFrame
#
# limit based on sp_prepexec parameter count
tsql_chunksize = 2097 // len(df.columns)
# cap at 1000 (limit for number of rows inserted by table-value constructor)
tsql_chunksize = 1000 if tsql_chunksize > 1000 else tsql_chunksize
#
df.to_sql('tablename', engine, if_exists='replace', index=False, chunksize=tsql_chunksize)

然而,最快的方法仍然可能是:

  • 将数据帧转储到CSV文件(或类似文件),然后

  • 让Python调用sqlserverbcp实用程序将该文件上载到表中。

根据戈德汤普森的回答做了一些修改。这将自动计算chunksize并将其保持为符合2100参数限制的最小最近整数值:

import math
df_num_of_cols=len(df.columns)
chunknum=math.floor(2100/df_num_of_cols)
df.to_sql('MY_TABLE',con=engine,schema='myschema',chunksize=chunknum,if_exists='append',method='multi',index=False )

相关问题 更多 >

    热门问题