Python SELECT WHERE查询参数传递报错,求排查解决
问题分析与解决
先拆解你遇到的两个错误:
第一个错误:not all arguments converted during string formatting
当你直接传grp给execute时,如果grp是字符串、列表这类序列类型,execute会把它拆成多个独立参数。比如grp = "test",会被拆成['t','e','s','t'],如果你的SQL里只有1个占位符,参数数量就不匹配,直接报错。
第二个错误:can only concatenate str (not "tuple") to str
这个问题大概率是你写achaGrp的SQL时,手动拼接了字符串,而不是用参数化占位符。比如你写了:
sql = "SELECT * FROM grp_table WHERE grp=" + grp
当你传[grp]时,grp可能是个元组或者其他非字符串类型,拼接时就会触发这个错误。而你的achaReg应该是用了正确的参数化写法,所以没问题。
正确的写法示范
第一步:用参数化SQL(绝对不要手动拼接)
根据你用的数据库类型写占位符:
- MySQL/PostgreSQL用
%s - SQLite用
?
比如:
sql = "SELECT * FROM grp_table WHERE grp = %s" # 以MySQL为例
第二步:正确传递单个参数
单个参数必须放在元组或列表里,注意元组要加逗号(不然会被当成单个变量,不是序列):
# 方法1:用元组(推荐) bclogon.execute(sql, (grp,)) # 方法2:用列表 bclogon.execute(sql, [grp])
对比排查
去看你的achaReg函数,它的SQL肯定是用了对应数量的占位符,并且参数是一个长度匹配的列表/元组。把achaGrp照着这个格式改,就能解决问题。
内容的提问来源于stack exchange,提问作者Redbob
相关产品推荐
相关产品推荐

