Python 组合sql查询中列表参数的正确格式

Python 组合sql查询中列表参数的正确格式,python,amazon-redshift,psycopg2,Python,Amazon Redshift,Psycopg2,我正在尝试执行一个sql查询,并将联接列表作为参数。 我已经建立了一个数据库连接,我想进行如下查询: 从MYDATABASE.MY_表中选择* 其中(名称在('name1','name2')); 所以我想把这个列表作为一个参数传递,变量过滤器是一个存储了正确格式的变量,但没有实际使用。 应该这样做的代码是: my_list=['name1','name2'] filters=“,”.join((“{}”.format(key)表示my_列表中的key)) q=sql.sql(“”“从MYDAT

我正在尝试执行一个sql查询,并将联接列表作为参数。 我已经建立了一个数据库连接,我想进行如下查询:

从MYDATABASE.MY_表中选择*
其中(名称在('name1','name2'));
所以我想把这个列表作为一个参数传递,变量过滤器是一个存储了正确格式的变量,但没有实际使用。 应该这样做的代码是:

my_list=['name1','name2']
filters=“,”.join((“{}”.format(key)表示my_列表中的key))
q=sql.sql(“”“从MYDATABASE.MY_表中选择*,其中({})中的名称;“”)
.format(sql.sql(','))
.join(sql.Placeholder()*len(我的列表)))
cur=self.con.cursor()
query=q.as\u字符串(context=self.con)
当前执行(q)
结果=cur.fetchall()
当前关闭()
查询的字符串为:

'从MYDATABASE.MY_表中选择*,其中(名称在(%s,%s));'

,这似乎是对的。
但关于转义角色有一个错误,我找不到解决的办法
最后,我必须使用占位符,而不是简单的
“…其中name={}”.format() 解决方案,主要是出于安全原因。 有什么帮助吗

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

'错误:在“,”处或附近出现语法错误,“
第1行:…我的表格,其中(名称在(?,)中)
..................................................................... ^'

试试这个:

cursor.execute("SELECT * FROM MYDATABASE.MY_TABLE WHERE (name IN (?,?))",my_list[0], my_list[1])
您可以简单地使用“,”。join(my_list),这将用“,”作为分隔符连接您的表:

my_list = ['name1', 'name2', 'name3', 'name4']
joined_list = "', '".join(my_list)   # Returns: "name1,name2,name3"

formatted = f"SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ('{joined_list}') )"
print(formatted) # Result: "SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ('name1', 'name2', 'name3', 'name4') )"
编辑:这里有一个更好的解决方案来避免SQL注入

my_list = ['name1', 'name2', 'name3', 'name4']
place_holders = "?," * (len(my_list) -1) + "?"

formatted = f"SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ({place_holders}) )"
print(formatted) # Result: "SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN (?,?,?,?) )"

您可以在那里应用解包
cursor.execute(“SELECT*FROM MYDATABASE.MY_TABLE WHERE(name IN(?,))”,*MY_list)
这是一个仅包含2个项目的列表的解决方案,但列表的长度可以更改,并且每次调用都会有所不同。那么,在每次调用中,这将如何在不同的长度下工作呢?可能重复的I get a exeption:在字符串格式期间并非所有参数都转换抱歉,我又错过了一行,现在检查它。这应该是有效的,我得到的错误与begging相同:语法错误在语法错误在或附近”,“第1行:…E.我的表名在(?,)现在尝试最后一个更改这给了我一个语法错误,因为要使查询成功,名称必须单引号引为:“name1”。只有当联接的_列表是:filters=“,”.join(“{}”.format(key)for key in my_list))时,这才起作用,但这种情况下的问题是,它是否可以避免sql注入,等等。不,它不安全。我在答案中添加了另一种方法来做占位符的事情,所以你可以在执行itSo时解压列表,将其作为参数传递。现在我得到了一个TypeError,可能是因为做了一些错误,“函数最多需要2个参数(给定3个)”。我将列表解压为:cur.execute(q,*my_list)哎哟,我没有注意到,当执行查询时,只要向它传递一个元组,它就会在执行过程中解压。它应该像cur.execute(q,tuple(my_list)),在您的案例中,我得到的语法错误与我从一开始就得到的语法错误相同:语法错误在或接近“,”第1行:…我的表,其中(名称在(?,)…)^
my_list = ['name1', 'name2', 'name3', 'name4']
place_holders = "?," * (len(my_list) -1) + "?"

formatted = f"SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ({place_holders}) )"
print(formatted) # Result: "SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN (?,?,?,?) )"