在使用pymysql向数据库传入sql语句的时候,轻信了pymysql官方文档中的案例
我的sql需求如下
SELECT count(1)
FROM
`test_img2`
WHERE
version = 'v5.02' AND FIND_IN_SET('"safetySign":0', recsign)
-- 其中v5.02需要用变量传入,safetySign和后边的0都是需要变量传入的参数
使用以下Python代码(仿照官方文档案例,用cursor.execute()传参)
sql = "select count(1) FROM test_img3 WHERE version = '%s' AND AND FIND_IN_SET('"%s" = %d')"
cursor.execute(sql, (chartype[i],version[i], j)) #此处用的是cursor.execute()的内部格式化传参
得到的结果是报错的,首先就是Python不认这个字符串,然后我加了转义字符
sql = "select count(1) FROM test_img3 WHERE version = '%s' AND AND FIND_IN_SET(\'\"%s\" = %d\')"
cursor.execute(sql, (chartype[i],version[i], j)) #此处用的是cursor.execute()的内部格式化传参
结果是传入sql中读不出任何数据
然后我又用cursor中的escape_string()方法,结果把斜杠\传入了sql,然后sql又读不出来斜杠,报错。
最后发现,如果要传参直接就用Python内部的格式化传参,在sql语句进入cursor.execute()之前就把参数传到sql变量中
于是就像以下这样
sql = "SELECT * FROM test_img2 WHERE version = '%s' AND FIND_IN_SET(\'\"%s\":%d\', recsign)" % (algo_version,char_type,char_num)
cursor.execute(sql)
完美运行!