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

问题描述 投票:0回答:2

最近,我在准备带有

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)

注意:如果可以进一步优化,还在寻求大家的意见。

python sql python-2.7 rawsql
2个回答
0
投票

我在 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}');")

0
投票

如果您强调防止 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)
    ...
© www.soinside.com 2019 - 2024. All rights reserved.