最近,我在准备带有
In clause
的原始 Sql 查询时卡住了一会儿,并且 In clause
数据是 python list
。
好吧,让我把我的例子放在这里。
我想要的Sql查询
sql_query = 'SELECT * FROM student WHERE first_name IN ("Dean");'
根据我掌握的数据
data = ["Dean"]
query = 'SELECT * FROM student WHERE first_name IN %s;' % str(tuple(data))
# result was "SELECT * FROM student WHERE first_name IN ('Dean',) "
# see the *Comma* just before close parentheses which is a Sql error
但是经过一些练习后,我想出了这样的解决方案
str_data = ','.join(repr(x) for x in data)
query = 'SELECT * FROM student WHERE first_name IN (%s);' % str_data
# Gives proper result i.e "SELECT * FROM student WHERE first_name IN ('Dean');"
现在我的问题是,这是一个优雅的解决方案还是我们在 python 中还有其他几种优化方法。如果您对此有何看法,我们将不胜感激:)。
编辑 达成另一种解决方案
data = tuple(data) if len(data) > 1 else "('%s')" % data[0] # Assumption: data should not be empty (in my case it is true)
query = 'SELECT * FROM student WHERE first_name IN {};'.format(data)
注意:如果可以进一步优化,还在寻求大家的意见。
我在 postgres 数据库上的 python3 中使用了这个,特别是如果你想要字符串 在 IN 运算符之后。请注意双引号与单引号:
data = ['test', 'test2', 'test3']
data_str = "', '".join(data)
query = "SELECT * FROM student WHERE first_name IN ('{}');".format(data_str))
或者如果您喜欢 f 弦,可以这样:
print(f"SELECT * FROM student WHERE first_name IN ('{data_str}');")
如果您强调防止 SQL 注入的重要性,将会有所帮助。防范此类漏洞非常重要。如果您有一种方法可以动态管理 IN 表达式的多个值并防止 SQL 注入,那么该方法确实很好。
data = ['test', 'test2', 'test3']
data_str = {','.join(['%s'] * len(data))}
query = f"SELECT * FROM student WHERE first_name IN ({data_str});"
...
with connection.cursor() as cursor:
cursor.execute(query, data)
...