在使用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)

完美运行!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐