0

我在 django 中使用带有 Model.objects.raw() 的查询语句“like %s%”时遇到问题。我猜问题出在“%”字符上,但我不知道它在哪里。这是我的模型的代码:

def listInRange(self, placeLat, placeLng, typeId, range, placeTag):
    tags = ''
    if placeTag:
        tags = "AND (placeTag LIKE '%" + "%' OR placeTag LIKE '%".join(placeTag.split(',')) + "%')"

    query = "SELECT *, \
            ( \
                6371000 * \
                acos( \
                    cos( radians(%s) ) * \
                    cos( radians(placeLat) ) * \
                    cos( radians(placeLng) - radians(%s) ) + \
                    sin( radians(%s) ) * \
                    sin( radians(placeLat) ) \
                ) \
            ) AS placeDistance, \
        COUNT(r.reviewId) as placeReviews, \
        (SUM(r.reviewPointPrice)/COUNT(r.reviewId)+SUM(r.reviewPointService)/COUNT(r.reviewId)+SUM(r.reviewPointLocation)/COUNT(r.reviewId)+SUM(r.reviewPointCondition)/COUNT(r.reviewId)+SUM(r.reviewPointComfort)/COUNT(r.reviewId))/5 AS averagePoint \
        FROM place_place p \
        LEFT JOIN review_review r \
        ON r.reviewPlace_id = p.placeId\
        WHERE placeType_id = %s %s \
        GROUP BY p.placeId \
        HAVING placeDistance < %s \
        ORDER BY placeDistance"

    return Place.objects.raw(query, [placeLat, placeLng, placeLat, typeId, tags, range])

如果 placeTag 不为空,则将其添加到 WHERE 条件中。当 placeTag 为空时没有这样的问题,但是当 placeTag 不为空时,我得到了这个错误:

Warning: Truncated incorrect DOUBLE value: '1AND (placeTag LIKE '%cafe%' OR placeTag LIKE '%pub%')'

使用带有“like”语句的 Model.objects.raw() 编写 sql 语句的更好方法是什么?

4

1 回答 1

0

"1AND"在输出中首先让我认为您缺少一些空格字符(在用于连接 ex 的字符串的开头和结尾)。

在您的情况下,您的 where 子句是"WHERE placeType_id = 1AND (placeTag..."


通常,如果您尝试将 double 与不是的东西进行比较,则会引发这种错误,但当逻辑断言拼写不正确时,也会经常引发这种错误。

稍后,如果您遇到错误“列不存在”,请注意大写字母,一些 DBGS 不会从“”或“”中读取大小写。

于 2013-07-16T11:53:03.633 回答