我有一个基于 django 的Web应用程序,其中包括对时间历史的分析。我目前正在使用 sqlite 作为数据库后端。
我通常以10分钟为一组对数据进行分组,因此我会聚合得到最终结果。
要获得十分钟的数据块,我有以下查询集
blocks = qs.extra({'ten_min' : u"strftime('%Y%m%d%H0', date) + strftime('%M', date)/10"})\
.values('ten_min').annotate(mop.Sum('event_val1'),mop.Sum('event_val2')).all()
我也可能在给定的时间间隔内限制,例如:
qs.get(date__gte = last_midnight)
虽然两个查询在分开时完美运行,但它们不会链接。
django生成的最终参数化SQL查询字符串无法呈现,因为sqlite的%
中的strtftime
被误解为在呈现字符串时要替换的元素。
为了清楚起见,让我报告整个查询:
params = (u"'2016-10-06 00:00:44.054382'",)
sql = u'SELECT (strftime(\'%Y%m%d%H0\', date) + strftime(\'%M\', date)/10) AS "ten_min", SUM("event_logger_event"."event_val1") AS "event_val1__sum", SUM("event_logger_event"."event_val2") AS "event_val2__sum" FROM "event_logger_event" WHERE "event_logger_event"."date" >= %s GROUP BY (strftime(\'%Y%m%d%H0\', date) + strftime(\'%M\', date)/10)'
查询呈现为sql % params
,这会产生错误。
事实上,系统会尝试替换%Y%m%d
等元素而不是正确的
... "date" >= %s ...
有关如何处理此问题的任何建议吗?