【问题标题】:problems with django raw query parametersdjango原始查询参数的问题
【发布时间】:2012-03-13 04:37:45
【问题描述】:

我试图对模型进行自定义原始查询,但出现此错误:

DatabaseError: error de sintaxis en o cerca de «E'positions_statusrecord'» 第 1 行:选择 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。

我搜索了有关原始查询参数的信息以查看是否有一些禁止的格式选项,但我没有找到任何对我有帮助的信息。

有谁知道是什么导致了这个错误?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    似乎原始查询无法通过参数完成“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)。

    看看你能不能用QuerySet.extra()替换raw(),用EXISTS替换SQLIN

    【讨论】:

    • 感谢您的快速回答!我认为始终建议将参数传递给“params”参数中的原始查询。我是安全问题的新手,所以我一直尝试以这种方式使用它。但在这种情况下,它确实是一个值得信赖的输入。关于“EXISTS”问题,我想我以前做过,但是以另一种方式,我遇到了一些性能问题。如果我是对的,该查询将为表中的每个条目创建一个子查询,并且该表中有很多条目(超过 2000 个)。虽然我认为我已经这样做了,但我会再试一次。非常感谢!
    • @marianobianchi:2000 个条目相当少,您可能会发现 INEXISTS 之间没有区别。
    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-11-21
    • 2012-03-16
    • 2015-05-26
    相关资源
    最近更新 更多