忠告:使用pymysql的时候,不要用cursor.execute自带的格式化输入,尤其是sql中引号比较多的时候

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

完美运行!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值