Python使用SQLAlchemy执行PostgreSQL查询出现KeyError如何解决
问题原因
你编写的SQL语句中%(23658989187|23658988997|23658989130)的写法,被pandas+SQLAlchemy的底层逻辑识别为命名参数占位符,框架会自动尝试从你传入的params参数中匹配对应key的取值做替换。由于你没有传入对应参数,因此直接抛出KeyError。
而Postico是直接将完整语句发送到PostgreSQL服务端执行,不会做本地的参数解析替换,所以相同语句可以正常运行。
解决方案
方案1:转义百分号(快速修复)
将SQL语句中所有需要作为普通字符处理的%替换为%%,框架就会将其识别为普通字符,不会当作参数占位符处理,修改后代码如下:
query = ''' select * from <table_name> where data similar to '%%(23658989187|23658988997|23658989130)%%' limit 10; ''' df = pd.read_sql_query(query, connection) df
方案2:显式传参(更规范,防SQL注入)
不要把匹配条件硬编码在SQL语句里,通过pandas.read_sql_query的params参数传入匹配规则,不需要转义,也更安全:
query = ''' select * from <table_name> where data similar to %(pattern)s limit 10; ''' params = {"pattern": "%(23658989187|23658988997|23658989130)%"} df = pd.read_sql_query(query, connection, params=params) df
内容的提问来源于stack exchange,提问作者Patthebug
相关产品推荐
相关产品推荐

