Django SQL标识符替换-使用列名列表

Django SQL标识符替换-使用列名列表,django,python-3.x,psycopg2,Django,Python 3.x,Psycopg2,我正在尝试运行以下表单的查询: 从foo=VALUE的表中选择{} 但是我希望能够提供一个列表来替换{} 根据psycopg文档,为了安全地执行此操作,您需要使用sql.Identifier函数,以便正确地转义参数,然后执行以下操作: SQL = sql.SQL( "SELECT {} FROM foo WHERE bar = %s" ).format(identifier) cursor.execute(SQL, [VALUE]) 当identifier是一个元素时,这是可行的,但

我正在尝试运行以下表单的查询:

从foo=VALUE的表中选择{}

但是我希望能够提供一个列表来替换{}

根据psycopg文档,为了安全地执行此操作,您需要使用
sql.Identifier
函数,以便正确地转义参数,然后执行以下操作:

SQL = sql.SQL(
    "SELECT {} FROM foo WHERE bar = %s"
).format(identifier)

cursor.execute(SQL, [VALUE])
identifier
是一个元素时,这是可行的,但我需要它是一个任意数。例如,如果:

identifier=[“abc”,“def”]

VALUE=4

SQL=从foo中选择abc def,其中bar=4

我已经尝试为
标识符的每个成员运行
sql.Identifier(x)
,但是这给了
“abc”“def”
,这显然是不正确的。

您需要使用它,使其像列表理解一样工作:

from psycopg2 import sql

cols = ["abc", "def"]
query = sql.SQL(
    "select {0} from {1} where abc = %s").format(
        sql.SQL(', ').join([sql.Identifier(c) for c in cols]),
        sql.Identifier('foo')
)
cur = conn.cursor()
print(query)
print(cur.mogrify(query, ('1', )))
cur.execute(query, ('1', ))
print (cur.rowcount, cur.fetchall())
输出:

Composed([SQL('select '), Composed([Identifier('abc'), SQL(', '), Identifier('def')]), SQL(' from '), Identifier('foo'), SQL(' where abc = %s')])
select "abc", "def" from "foo" where abc = '1'
(1, [('1', '2')])

有什么理由把它贴上Django标签吗?你不能用Django ORM吗?@Saturnix因为它是Django的游标对象,但这不是什么大问题。不幸的是,我不能在这里使用ORM。这会像这样逃逸列名:
“foo”
,而不是postgres似乎不喜欢的
foo
。这很有效,只是编辑了答案。您是否收到任何错误?错误是该列不存在。查询在列名周围不加引号。