我想要的是执行sql
select * from articles where author like "%steven%"
。
为了安全起见,我这样使用:
cursor.execute('select * from articles where %s like %s', ('author', '%steven%')
然后结果只是空的,没有得到语法错误,只是空集。 但我很确定里面有一些东西,我可以得到结果使用第一个sql。我的代码有什么用吗?
答案 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%'
,查看标题周围的引号,这就是我得到空集的原因。
所以请始终记住格式化后的字符串会引用