如何在pandas 1.5.1中为read_sql_query传递bool和int类型的params参数
问题描述
Pandas 1.5.1里
read_sql_query的params参数类型被定义为list[str] | dict[str, str] | None,而1.4.4版本没有明确类型限制。之前在1.4.4中,我用包含bool类型变量is_simple和int类型变量lookback的列表作为params(代码:pandas.read_sql_query(sql=file.read(), con=connection, params=[is_simple, lookback]))能通过PyCharm检查,但升级到1.5.1后,代码检查提示类型错误,因为期望是list[str]。但我的SQL Server脚本需要接收INT类型的is_simple和lookback,该怎么正确传递这两种类型的参数?
解决办法
1. 临时忽略PyCharm类型提示
如果确认参数传递逻辑没问题(SQL Server能正确解析bool/int),可以用注释跳过类型检查:
# noinspection PyTypeChecker pandas.read_sql_query(sql=file.read(), con=connection, params=[is_simple, lookback])
或者给参数加类型注释强制兼容:
params: list[int | bool] = [is_simple, lookback] pandas.read_sql_query(sql=file.read(), con=connection, params=params)
2. 改用字典形式传递(推荐)
用命名参数的字典形式,虽然Pandas类型标注写的是dict[str, str],但实际驱动(比如SQLAlchemy或pyodbc)会自动处理类型转换,SQL Server能正确识别INT类型:
params = { "is_simple": is_simple, "lookback": lookback } # SQL脚本要对应使用命名占位符,比如:WHERE is_simple = :is_simple AND lookback = :lookback pandas.read_sql_query(sql=file.read(), con=connection, params=params)
这种方式不仅更易维护,类型提示的冲突也会更小。
3. 手动转换参数类型
把bool转成int(SQL Server用0/1表示布尔值),直接传int类型参数:
params = [int(is_simple), lookback] pandas.read_sql_query(sql=file.read(), con=connection, params=params)
这样参数列表类型是list[int],虽然和Pandas标注的list[str]仍有差异,但实际运行完全正常,类型检查工具也会更友好。
4. 修正Pandas类型定义(长期方案)
Pandas 1.5.1的这个类型定义其实不准确,params实际支持多种数据类型(只要驱动能处理)。可以去Pandas的GitHub仓库提交Issue或PR,把read_sql_query的params类型注解改成list[Any] | dict[str, Any] | None,后续版本就能解决这个提示问题。
内容的提问来源于stack exchange,提问作者scorpio

