我在django中使用查询语句“喜欢%s%”与Model.objects.raw()有问题。我想问题是'%'字符,但我不知道它在哪里。这是我模型的代码:
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语句的更好方法是什么?
答案 0 :(得分:0)
"1AND"
首先让我觉得你缺少一些空格字符(在用于加入ex的字符串的开头和结尾)。
在您的情况下,您的where子句为"WHERE placeType_id = 1AND (placeTag..."
通常情况下,如果你试图将double与不匹配的东西进行比较,会产生一种错误,但是当逻辑断言没有拼写正确时,它也经常被提出。
稍后,如果您有错误“列不存在”,请小心上限,某些DBGS不会读取“”或“”的情况。