栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

更新:

熊猫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 counttsql_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 Server

    bcp
    实用程序将文件上传到表中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639478.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号