首页 > 解决方案 > 组合sql查询中列表参数的正确格式

问题描述

我正在尝试使用连接列表作为参数执行 sql 查询。我已经建立了一个数据库连接,我想要一个类似的查询:

SELECT * FROM MYDATABASE.MY_TABLE
WHERE ( name IN ('name1','name2') );

所以我想将列表作为参数传递,变量过滤器是存储了正确格式但没有实际使用的变量。应该这样做的代码是:

my_list = ['name1', 'name2']
filters = ",".join(("'{}'".format(key) for key in my_list))

q = sql.SQL('''SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ({}) );''')
       .format(sql.SQL(', ')
       .join(sql.Placeholder() * len(my_list)))

cur = self.con.cursor()

query = q.as_string(context=self.con)
cur.execute(q)
results = cur.fetchall()
cur.close()

字符串查询是:

'SELECT * FROM MYDATABASE.MY_TABLE WHERE (name IN (%s, %s));'

,这似乎是正确的。
但是转义字符有一个错误,我找不到解决方法。
最后,我必须使用占位符而不是简单的
".... where name = {}".format() 解决方案,主要是出于安全原因。有什么帮助吗?

编辑:我尝试了所有建议,它们都给了我语法错误:

'错误:“,”或附近的语法错误
LINE 1: ....MY_TABLE WHERE (name IN (?,?))
.................... ..................................................... . ^'

标签: pythonamazon-redshiftpsycopg2

解决方案


placeholder = '?'
placeholders = ', '.join(placeholder for unused in mylist)
query = "SELECT * FROM MYDATABASE.MY_TABLE WHERE (name IN (%s))" % placeholders
list = ",".join(my_list)    
cursor.execute(query, list)

推荐阅读