SQLAlchemy是否可以通过数据库函数或存储过程进行筛选?

时间:2013-10-17 15:08:32

标签: python sql-server sqlalchemy

我们在具有旧数据库的项目中使用SQLalchemy。数据库具有功能/存储过程。过去我们使用原始SQL,我们可以在查询中使用这些函数作为过滤器 如果可能的话,我想对SQLAlchemy查询执行相同的操作。我已经阅读了关于@hybrid_property的内容,但其中一些函数需要一个或多个参数,例如;

我有一个用户模型,它对一堆历史记录有一个JOIN。这个用户的这些历史记录具有日期和借方和贷方字段,因此我们可以在特定时间点查找用户的余额,方法是在给定日期之前执行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()

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

欢迎任何有关如何实现此类内容的建议(如果可能的话)。

谢谢,

1 个答案:

答案 0 :(得分:1)

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

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

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