当前位置: 首页 > 面试题库 >

to_sql pyodbc计数字段不正确或语法错误

水焱
2023-03-14
问题内容

我正在从api网站下载Json数据,并使用sqlalchemy,pyodbc和pandas的to_sql函数将该数据插入到MSSQL服务器中。

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

DBAPIError:(pyodbc.Error)(“ 07002”,“ [07002] [Microsoft] [SQL
Server本机客户端11.0]
COUNT字段不正确或语法错误(0)(SQLExecDirectW)”)[SQL:’插入到[TEMP_production_entity_details]

大约有5亿行可供下载,它正以这种速度爬行。有任何解决方法的建议吗?

谢谢,


问题答案:

更新:

熊猫0.23.1已恢复0.23.0中引入的问题更改。但是,原始性能的最佳解决方案仍然是CSV->bcp方法,如下所述。

(原始答案)

在熊猫版本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现在会生成一个表值构造函数,以便在每次调用时插入多行

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

问题在于,SQL
Server存储过程(包括类似的系统存储过程sp_prepexec)仅限于2100个参数,因此,如果DataFrame具有100列,则to_sql一次只能插入约20行。

我们可以chunksize使用

# 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)

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

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

  • 让Python调用SQL Serverbcp实用程序将文件上传到表中。



 类似资料:
  • 当我输入用户名和密码时,我收到了这个错误消息,我不知道这个错误是什么,我如何修复它。错误消息是: 关键字from附近的语法不正确。 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。 异常详细信息:系统。数据SqlClient。SqlException:关键字“from”附近的语法不正确。 源错误: 第30行:Sql命令cmd=new Sq

  • 我正在尝试用Selenium在Java中创建ajax wait方法,以获取配置所定义的尽可能多的结果。 我是否应该担心XPath表达式不是snytax正确的,或者Selenium找不到那个webelement?这个例外对我来说是模棱两可的....

  • 我正试图写一个C程序来计算元音、键击和字母字符的数量。击键计数器正在工作,但是元音计数器总是关闭一个元音。阿尔法计数器坏了。

  • 堆栈跟踪: [SqlException(0x80131904):关键字“from”附近语法不正确。] System.Data.sqlclient.sqlConnection.onerror(SqlException exception,Boolean breakConnection,Action`1 wrapCloseInAction)+1791910 System.Data.sqlClient.

  • 问题内容: 您好,我试图弄清楚为什么在MSSQL中将兼容模式从80切换为100会破坏下面的功能? 这是我的功能: 问题答案: 尝试在with前面加一个半冒号: 给这篇文章读明白,为什么你需要做到这一点。尖刺: 但是,如果CTE不是批处理中的第一条语句,则必须在WITH关键字之前加上分号。作为一种最佳实践,我宁愿在所有CTE前面加上分号,以使这种一致的方法比记住我是否需要分号更容易。 就个人而言,我

  • 问题内容: 我知道很多人偶尔也会遇到相同的错误,但是我已经查看了所有先前的答案和我的代码,并且尝试了使用col和不使用反引号。这是我目前尝试使用的代码,但同样 该表中还有其他列,但是只有上面的我想为其余部分添加数据的列可以最初使用默认值 我一直在看这段代码很久了,现在我才发现问题,我知道这很愚蠢 问题答案: 将变量添加到SQL查询中的最防错的方法是通过 准备好的语句 添加变量。 因此,对于您运行的