You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用pandas read_sql结合SQL Server传参查询报错及结果获取问题

Python结合SQL Server使用pandas read_sql传参报错及结果获取问题

咱们逐个分析你遇到的两个问题:

一、read_sql传参报错的原因

你碰到的这个错误,核心问题出在params参数的格式上。pandas.read_sql要求params必须是序列类型(比如列表、元组),但你直接传了单个字符串x = "FirstName"。在Python里,字符串本身是可迭代对象,会被拆解成每个字符当作独立参数——"FirstName"刚好有9个字符,所以就出现了「SQL有1个占位符,但传入了9个参数」的报错。

另外你代码里定义的cursor = cnn.Cursor其实没有用到,可以删掉。修正后的代码如下:

import pyodbc as cnn
import pandas as pd

cnxn = cnn.connect('DRIVER={SQL Server};SERVER=SQLSERVER;DATABASE=DATABASE')
x = "FirstName"

# 方式1:用列表包裹参数
tableResult = pd.read_sql(
    "SELECT * FROM TABLE where COLUMN = ?",
    cnxn,
    index_col=None,
    coerce_float=True,
    params=[x]
)

# 方式2:用元组(单个元素的元组必须加逗号,否则会被当成普通变量)
# tableResult = pd.read_sql(
#     "SELECT * FROM TABLE where COLUMN = ?",
#     cnxn,
#     index_col=None,
#     coerce_float=True,
#     params=(x,)
# )

二、如何获取cnxn.execute的查询结果

你用cnxn.execute()得到的是pyodbc.Cursor对象,它本身不是结果集,需要调用方法来提取数据,常用的有这几种方式:

  • 一次性获取所有结果:用fetchall(),返回一个由元组组成的列表,每个元组对应一行数据:
    cursor = cnxn.execute("SELECT * FROM TABLE where COLUMN = ?", x)
    all_results = cursor.fetchall()
    # 遍历输出每一行
    for row in all_results:
        print(row)
    
  • 逐行获取结果:用fetchone()每次获取一行,直到返回None(表示没有更多数据):
    cursor = cnxn.execute("SELECT * FROM TABLE where COLUMN = ?", x)
    current_row = cursor.fetchone()
    while current_row is not None:
        print(current_row)
        current_row = cursor.fetchone()
    
  • 转换成pandas DataFrame(推荐):如果习惯用DataFrame做数据处理,可以把结果转成DataFrame,同时保留列名:
    cursor = cnxn.execute("SELECT * FROM TABLE where COLUMN = ?", x)
    # 从cursor.description中提取列名(每个元素的第一个值就是列名)
    column_names = [col[0] for col in cursor.description]
    tableResult2 = pd.DataFrame(cursor.fetchall(), columns=column_names)
    # 现在tableResult2就是你熟悉的DataFrame了,可以直接用pandas的方法处理
    

内容的提问来源于stack exchange,提问作者Tom Longworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:17:26