execute传参与字符串格式化传参的差异及报错求助
解决
not all arguments converted during string formatting 异常 问题根源
你遇到的这个错误,核心原因是传给execute()的参数格式不符合要求。数据库驱动的execute()方法要求参数必须是一个元组(或列表),哪怕你只有一个参数也不能直接传单个值。
你现在写的是:
cursorErrorData.execute(query, str(row[0]))
这里str(row[0])是单个字符串(值为"3090"),驱动会把它当成一个字符序列(比如拆成['3','0','9','0'])去匹配查询里的%s占位符,而你的查询只有一个占位符,自然就会抛出“不是所有参数都完成转换”的异常。
修复方案
把单个参数包装成带逗号的元组(这是Python里创建单元素元组的标准写法),修改后的代码如下:
方案1:保留字符串转换(如果jobid确实需要字符串类型)
query = 'Select "logtext" from log where jobid = %s;' cursorErrorData.execute(query, (str(row[0]),)) # 注意末尾的逗号!
方案2:直接传数值(推荐,若jobid是数值类型)
如果jobid在数据库里是整数类型,其实不需要手动转字符串,驱动会自动处理类型匹配,这样更简洁:
query = 'Select "logtext" from log where jobid = %s;' cursorErrorData.execute(query, (row[0],)) # 直接传row[0],包装成元组即可
补充说明
为什么之前运行正常?可能是你用的数据库驱动旧版本对单个参数的处理比较宽松,允许直接传单个值,但这不符合标准用法。标准的参数化查询写法必须传递可迭代的参数集合(元组/列表),所以加上逗号确保是元组就可以解决问题。
另外,一定要坚持用这种参数化查询的写法,不要用字符串格式化拼接SQL,后者会带来SQL注入的安全风险,这也是你一开始选择第一种写法的核心原因对吧😉
内容的提问来源于stack exchange,提问作者Micolho
相关产品推荐
相关产品推荐

