pd.read_sql传列表执行IN查询报Not all parameters were used错误如何解决
问题排查与解决方案
报错根因
你使用的mysql-connector驱动的参数占位符规则不匹配,该驱动默认使用%s作为占位符,而非你代码中写的?,?是SQLite等其他数据库驱动的占位符格式,占位符不匹配导致驱动识别不到你传入的参数,触发参数未被使用的报错。
修复代码
直接修改占位符生成逻辑即可,修复后的代码如下:
tickerlist = ['AAPL US', 'GOOG US'] # 将占位符替换为mysql-connector支持的%s placeholders = ','.join('%s' for _ in range(len(tickerlist))) qry = 'SELECT * FROM table WHERE ticker IN (%s)' % placeholders data = pd.read_sql(qry, connection, params=tickerlist)
可选排查项
如果修改后仍有报错,可以额外检查两点:
- 不要混用不同数据库驱动的连接对象,不同驱动占位符规则不同,比如PostgreSQL的psycopg2用
%s、Oracle驱动用:1类格式,需要和你使用的驱动对应 - 确认你的查询语句中没有其他额外的占位符,所有需要传参的位置都和params中的参数数量匹配
内容的提问来源于stack exchange,提问作者shujufenxishi
相关产品推荐
相关产品推荐

