Python函数传整数参数报错:TypeError: 格式字符串参数不足
问题原因及解决方法
错误根源
你当前的SQL字符串格式化写法逻辑错误:整个SQL语句包含两个%i占位符,但你先单独用% interval1去格式化完整的SQL字符串,此时占位符数量(2个)和传入参数数量(1个)不匹配,直接触发TypeError,后面的% interval2根本没机会执行。
修复方法
把两个参数放在元组里,一次性完成字符串格式化:
def test_prod(interval1, interval2): with connection.cursor() as cursor: sql = 'SELECT COUNT(*) ' \ 'FROM `use` ' \ 'WHERE `usepcd` = 2 ' \ 'AND year(`uw_datetime_end`) = year(now()) ' \ 'AND uw_datetime_end >= CURDATE() - INTERVAL WEEKDAY(CURDATE()) day - INTERVAL %i week ' \ 'AND uw_datetime_end < CURDATE() - INTERVAL WEEKDAY(CURDATE()) day - INTERVAL %i week ' \ % (interval1, interval2) # 改为元组传入两个参数 cursor.execute(sql) row = cursor.fetchall() print(row) return row
更安全的写法(推荐)
直接用字符串格式化拼接SQL存在SQL注入风险,建议使用数据库驱动的参数化查询功能(以MySQL为例):
def test_prod(interval1, interval2): with connection.cursor() as cursor: sql = 'SELECT COUNT(*) ' \ 'FROM `use` ' \ 'WHERE `usepcd` = 2 ' \ 'AND year(`uw_datetime_end`) = year(now()) ' \ 'AND uw_datetime_end >= CURDATE() - INTERVAL WEEKDAY(CURDATE()) day - INTERVAL %s week ' \ 'AND uw_datetime_end < CURDATE() - INTERVAL WEEKDAY(CURDATE()) day - INTERVAL %s week ' cursor.execute(sql, (interval1, interval2)) # 参数放在元组中传入execute row = cursor.fetchall() print(row) return row
这种写法既规避了SQL注入风险,也能更规范地处理参数传递。
内容的提问来源于stack exchange,提问作者Overflowy2
相关产品推荐
相关产品推荐

