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

时间:2015-04-04 07:26:52

标签: python sql python-2.7 rawsql

最近我在准备原始Sql查询时遇到了In clause并且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)

注意:如果可以进一步优化,还在寻找你们的一些观点。

1 个答案:

答案 0 :(得分: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}');")