繁体   English   中英

Python pandas to_sql 最大2100个参数

[英]Python pandas to_sql maximum 2100 parameters

直到几天前,我总是将数千个参数存储到我的数据库(SQL 服务器)中。 我使用 spyder (Python 3.6)。 几天前我用 conda update 更新了所有包,现在我无法将我的数据帧导入我的数据库。

--- 我不希望在 2100 参数 DF 中拆分 ---

我想了解发生了什么变化以及为什么以及如何恢复正常工作。

这是一个简单的代码:

import pyodbc
import sqlalchemy
import numpy as np
import pandas as pd


c = pyodbc.connect("Driver={SQL Server};Server=**;Trusted_Connection=no;Database=*;UID=*;PWD=*;")
cursor = c.cursor()  
engine = sqlalchemy.create_engine('mssql+pyodbc://*:*/*?driver=SQL+Server')



df= pd.DataFrame(np.random.randn(5000))
df.to_sql('pr',engine,if_exists= 'append', index=False)

这是错误: ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The incoming request has too many parameters. 服务器最多支持 2100参数。减少参数数量并重新发送请求。(8003) (SQLExecDirectW)')

非常感谢

pandas 0.23 中的这个错误有一个开放的(截至 2018.06.01)问题

您可能希望降级到 0.22,这将按预期工作。

尝试限制块大小:

df.to_sql('pr',
          engine,
          chunksize=20,
          if_exists= 'append',
          index=False)

这对我有用。 认为选择正确的块大小数字的数学是:块大小 = 2100 / 您的列数

在幕后,Pandas 使用SQLAlchemy与数据库对话。 SQLAlchemy 准备并执行所谓的参数化查询。 SQLAlchemy 会将查询准备为带有? 作为数据的占位符。 它最终看起来像这样:

INSERT INTO my_table
VALUES (?,?,?,?,?, etc.)

到SQL服务器? 被视为参数。 SQL 服务器在参数化查询中只允许 2100 个这样的参数。

问题不在于数据集中的列数,而是 SQL 服务器仅允许您在参数化查询中包含最多 2100 位的数据。 使用参数化查询是因为它们将 SQL 和数据分开,这是防止意外执行恶意 sql 的重要保护措施。

正如您所发现的,您可以将工作分块,这样就不会达到 2100 的限制。 或者,您可以自己构造 SQL 并执行它,但这通常不被视为安全风险(SQL 注入攻击)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM