0

我们在一个带有遗留数据库的项目中使用 SQLalchemy。数据库具有函数/存储过程。过去我们使用原始 SQL,我们可以将这些函数用作查询中的过滤器。
如果可能的话,我想对 SQLAlchemy 查询做同样的事情。我已经阅读了@hybrid_property,但是其中一些函数需要一个或多个参数,例如;

我有一个用户模型,它连接到一堆历史记录。SUM(credit) - SUM(debit)该用户的这些历史记录有一个日期和一个借方和贷方字段,因此我们可以通过在给定日期之前查找用户在特定时间点的余额。
我们有一个名为dbo.Balance(user_id, date_time). 我可以使用它来检查用户在给定时间点的余额。

我想将此用作查询中的标准,以仅选择在特定日期/时间有负余额的用户。

selection = users.filter(coalesce(Users.status, 0) == 1,
                         coalesce(Users.no_reminders, 0) == 0,
                         dbo.pplBalance(Users.user_id, datetime.datetime.now()) < -0.01).all()

这当然是一个无效的示例,只是为了让您了解我想做的事情的要点。解决方案看起来是使用混合属性,但正如我上面提到的,这些只能在没有参数的情况下工作(因为它们是属性,而不是方法)。

欢迎任何关于如何实现这样的东西(如果可能的话)的建议。

谢谢,

4

1 回答 1

1

@hybrid_property 本身并不是一种生成特定 SQL 语句的方法,它只是一个可以为 ORM 映射类添加更多查询生成功能的助手。

可以作为普通函数调用的 SQL 函数(例如,没有任何类型的“EXEC XYZ”类型的语法)可以使用func构造调用,这意味着您的查询已经准备就绪:

from sqlalchemy import func
selection = users.filter(coalesce(Users.status, 0) == 1,
                         coalesce(Users.no_reminders, 0) == 0,
                         func.dbo.pplBalance(Users.user_id, datetime.datetime.now()) < -0.01).all()
于 2013-10-22T03:50:09.023 回答