Sql 将表名和值列表作为参数传递给psycopg2查询 上下文

Sql 将表名和值列表作为参数传递给psycopg2查询 上下文,sql,python-3.x,psycopg2,Sql,Python 3.x,Psycopg2,我想在函数的查询中传递一个表名和查询参数 如果我理解正确,我不应该在执行查询之前使用python方法格式化查询字符串,而是让我们这样做 问题 我无法成功地将表名和参数作为参数传递给查询字符串 代码示例 下面是一个代码示例: import psycopg2 from psycopg2 import sql connection_string = "host={} port={} dbname={} user={} password={}".format(*PARAMS.values()) con

我想在函数的查询中传递一个表名和查询参数

如果我理解正确,我不应该在执行查询之前使用python方法格式化查询字符串,而是让我们这样做

问题 我无法成功地将表名和参数作为参数传递给查询字符串

代码示例 下面是一个代码示例:

import psycopg2
from psycopg2 import sql
connection_string = "host={} port={} dbname={} user={} password={}".format(*PARAMS.values())

conn = psycopg2.connect(connection_string)
curs = conn.cursor()

table = 'my_customers'
cities = ["Paris", "London", "Madrid"]
data = (table, tuple(customers))

query = sql.SQL("SELECT * FROM {} WHERE city = ANY (%s);")

curs.execute(query, data)
rows = cursLocal.fetchall()

错误 但我收到以下错误消息:

TypeError: not all arguments converted during string formatting
我还尝试将
数据
定义替换为:

data = (sql.Identifier(table), tuple(object_types))
但是这个错误突然出现了:

ProgrammingError: can't adapt type 'Identifier'
如果我将
ANY{}
而不是
ANY(%s)
放在查询字符串中,在前面两种情况下,此错误显示:

SyntaxError: syntax error at or near "{"
LINE 1: ...* FROM {} WHERE c...
                  ^
最初,我没有使用该模块,而是尝试将
数据作为第二个参数传递给curs。方法,但随后该命令中的表名被单引号引用,这导致了问题。因此,我尝试了一下该模块,这不是一个不受欢迎的习惯。
如果可能,我想保留大括号
{}
作为参数替换,而不是
%s
,除非这是个坏主意

环境 Ubuntu 18.04 64位
5.0.0-37-generic x86_64 GNU/Linux

Python 3.6.9(默认值,2019年11月7日,10:44:02)


你想要的是:

table='我的客户'
城市=[“巴黎”、“伦敦”、“马德里”]
query=sql.sql(“SELECT*FROM{},其中city=ANY(%s)”).format(sql.Identifier(table))
执行(查询,(城市,))
rows=cursLocal.fetchall()

表的名称不能是参数。您必须按字面意思将其插入查询文本(用变量值替换占位符)或使用动态SQL。@Akina我认为您的注释可能是answer@PhungDuyPhong如果我能添加一些代码,我就可以写一个答案。但我对Python一无所知。。。如果可以,请添加它-我不介意。不将表名作为查询字符串的一部分传递有什么原因吗?一个简单的字符串构造将使它变得更安全,即使它不那么“安全”。我需要传递N个不同的表作为函数的参数,因此,我不想为此复制N次函数。您可以使用
psycopg2.sql
生成查询,您可能想看看这个答案
psycopg2.__version__    
'2.8.4 (dt dec pq3 ext lo64)'