Python:使用带有列表数据的In子句创建Sql原始查询

Python:使用带有列表数据的In子句创建Sql原始查询,python,sql,python-2.7,rawsql,Python,Sql,Python 2.7,Rawsql,最近,我在准备原始Sql查询时卡住了一会儿,其中包含In子句,而In子句数据是一个python列表。 好吧,让我举个例子 我想要的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 wa

最近,我在准备原始Sql查询时卡住了一会儿,其中包含
In子句
,而
In子句
数据是一个
python列表
。 好吧,让我举个例子

我想要的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优化方法。如果您能就此发表意见,我将不胜感激:)

编辑 达成另一个解决方案


注意:如果可以进一步优化,仍在寻找你们的一些视图。

我在python3的postgres数据库中使用了这一点,特别是如果您需要字符串 在输入操作符之后。请注意双引号和单引号:

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注入的攻击。这里的数据有一组唯一的varchar,我们正在处理。
print(f"SELECT * FROM student WHERE first_name IN ('{data_str}');")