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
。这很有效,只是编辑了答案。您是否收到任何错误?错误是该列不存在。查询在列名周围不加引号。