我试图为模型制作自定义原始查询,但我收到此错误:
DatabaseError:错误de sintaxis en o cerca de «E'positions_statusrecord'»第1行:SELECT id FROM E'positions_statusrecord'WHERE“type”= E'Leav ......
这是我正在尝试使用的原始查询(它是一种管理员方法):
def get_status_ids(self, model):
"""
This query returns the latest statuses ids for each entry
of "model" in StatusRecord.
"""
db_table = self.model._meta.db_table
model_type = model.get_status_type()
raw_query = (
"SELECT id "
"FROM %s "
"WHERE \"type\"=%s AND "
"(identifier,date_time) IN "
"( "
"SELECT identifier, Max(date_time) "
"FROM %s "
"WHERE \"type\"=%s "
"GROUP BY identifier"
")"
)
params = (db_table, model_type, db_table, model_type, )
return self.raw(raw_query, params)
我尝试过更简单的查询(只是SELECT ... FROM ..
)并遇到了同样的问题。似乎原始查询无法使用参数完成FROM
部分。
我是对的吗?或者我犯了一个错误,我找不到它?
我正在使用postgreSQL 8.4.10,django 1.3和python 2.6。
我搜索了有关原始查询参数的信息,看看是否有一些禁止格式化选项,但我找不到任何可以帮助我的东西。
有谁知道是什么导致了这个错误?
答案 0 :(得分:2)
似乎原始查询无法使用参数完成“FROM”部分。
是的,ORM将引用字符串参数,使其成为... FROM 'some_table' ...
。
由于db_table参数是可信的(不是来自用户输入),您可以执行以下操作:
raw_query = (
"SELECT id "
"FROM %s "
"WHERE \"type\"=%%s AND "
"(identifier,date_time) IN "
"( "
"SELECT identifier, Max(date_time) "
"FROM %s "
"WHERE \"type\"=%%s "
"GROUP BY identifier"
")"
) % (db_table, db_table)
return self.raw(raw_query, (model_type, model_type))
从Django Aggregation can be used in filters开始,您可以在不使用原始SQL的情况下获得相同的结果(另请参阅in
lookup example)。
看看您是否可以将raw()
替换为QuerySet.extra()
,将SQL IN
替换为EXISTS
。