1

我正在使用 sqlite+sqlalchemy,我正在这样做我得到一些看起来像这样的 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 中实际获得这些值的差异?

4

1 回答 1

1

SQLAlchemy 不需要显式定义每个数据库引擎中的每个函数。它知道一些标准的,但你可以使用sqlalchemy.func.foobar(arg1, arg2, ...)它,它会被翻译成foobar(arg1, arg2, ...)SQL 中的函数调用。改变

@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)

你应该没事。julianday不过,因为不可移植,所以坚持使用 SQLite 。

于 2013-08-09T07:13:29.253 回答