无法在pymysql中正确格式化sql

时间:2017-07-05 22:30:58

标签: python mysql pymysql

我想要的是执行sql select * from articles where author like "%steven%"

为了安全起见,我这样使用:

cursor.execute('select * from articles where %s like %s', ('author', '%steven%')

然后结果只是空的,没有得到语法错误,只是空集。 但我很确定里面有一些东西,我可以得到结果使用第一个sql。我的代码有什么用吗?

2 个答案:

答案 0 :(得分:1)

您无法将列名称设置为您正在执行where %s like %s的参数。要动态设置列名,您需要执行实际的字符串操作,如:

sql = 'select * from articles where '+ sql_identifier('author') +' like %s'
cursor.execute(sql, ('%steven%',))

其中sql_identifier是您的lib函数,用于使SQL注入安全的标识符。类似的东西:

# don't actually use this!
def sql_identifier(s):
  return '"%s"' % s.replace('"','')

但是通过实际测试和您正在使用的数据库引擎的知识。

答案 1 :(得分:1)

这里的问题是一个小错误。感谢@Asad Saeeduddin,当我尝试使用print cursor._last_executed来检查发生了什么。我发现实际执行的是 SELECT * FROM articles WHERE 'title' LIKE '%steven%',查看标题周围的引号,这就是我得到空集的原因。 所以请始终记住格式化后的字符串会引用