使用pandasql查询pandas DataFrame时报参数绑定不支持类型错误如何解决
错误原因
- 报错的根本原因是你的
data_five_minutesDataFrame里的数值字段(open/high/low/close/volume)是Python标准库的Decimal类型,pandasql底层依赖SQLite数据库,SQLite原生不支持直接写入Decimal类型的数据,因此在pandasql把DataFrame临时导入SQLite内存库的过程中触发了类型绑定错误。 - 该错误和你编写的SQL查询语句无关,此前你在业务数据库能正常执行SQL是因为常规业务数据库(如MySQL、PostgreSQL等)本身支持Decimal类型,和SQLite的类型支持程度不同。
解决方案
方案1:转换字段类型适配pandasql
如果需要继续使用pandasql执行SQL查询,可以先把Decimal类型的字段转换为float或int类型,再执行查询:
import pandas as pd # 数值列类型转换,可根据业务需求选择float或int类型 data_five_minutes[['open', 'high', 'low', 'close', 'volume']] = data_five_minutes[['open', 'high', 'low', 'close', 'volume']].astype(float) # 执行原SQL查询 data = ps.sqldf(f"""SELECT d4.script_id,d4.date_time,d4.open,d4.high,d4.low,d4.close,d4.volume FROM data_five_minutes d4 WHERE d4.script_id = {id}""")
方案2:使用Pandas原生方法替代pandasql
如果需要保留Decimal的高精度特性,可以直接用Pandas自带的筛选逻辑完成查询,不需要借助SQL语法,性能更高也不会有类型兼容问题:
# 简单等值筛选示例 data = data_five_minutes[data_five_minutes['script_id'] == id][['script_id', 'date_time', 'open', 'high', 'low', 'close', 'volume']]
复杂的嵌套WHERE条件也可以通过Pandas的布尔索引、query()方法实现,完全可以覆盖SQL的条件查询能力。
方案3:对接支持Decimal的数据库
如果必须使用复杂SQL语法且要保留高精度,可以将DataFrame写入你原有的支持Decimal类型的业务数据库临时表,再执行SQL查询读取结果即可。
内容的提问来源于stack exchange,提问作者Kabomi
相关产品推荐
相关产品推荐

