我正在使用sqlite + sqlalchemy而我正在做this而且我得到了一些看起来像这样的SQL:
SELECT task.id as task_id, task.title AS task_title
FROM task
WHERE (SELECT sum(coalesce(intervals."end", CURRENT_TIMESTAMP) - intervals.start) AS sum_1
FROM intervals
WHERE task.id = intervals.task_id) > :param_1
问题是这不起作用,因为我的查询实际上需要如下所示:
...
WHERE (SELECT sum(julianday(coalesce(intervals."end", CURRENT_TIMESTAMP)) - julianday(intervals.start)) AS sum_1
...
但是我无法在SQLAlchemy中找到julianday函数,或者确切地知道如何手动修改查询。
如何改变行为,以便我可以在sqlite中实际获得这些值的差异?
答案 0 :(得分:1)
SQLAlchemy无需明确定义每个数据库引擎中的每个函数。它知道一些标准的,但您可以使用sqlalchemy.func.foobar(arg1, arg2, ...)
,它将被转换为SQL中的函数调用foobar(arg1, arg2, ...)
。变化
@time_spent.expression
def time_spent(cls):
return func.coalesce(cls.end, func.current_timestamp()) - cls.start
到
@time_spent.expression
def time_spent(cls):
return func.julianday(func.coalesce(cls.end, func.current_timestamp())) - \
func.julianday(cls.start)
你应该没事。坚持使用SQLite,因为julianday
不可移植。