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
相关产品推荐
相关产品推荐

