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

2024-03-29 12:38:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个用户模型,它连接了一堆历史记录。此用户的这些历史记录有一个日期和一个借贷字段,因此我们可以通过在给定日期之前执行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属性,但是正如我前面提到的,这些属性只在没有参数的情况下工作(因为它们是属性,而不是方法)。在

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

谢谢


Tags: 函数用户id数据库参数历史记录datetime属性
1条回答
网友
1楼 · 发布于 2024-03-29 12:38:24

@hybrid_属性本身并不是生成特定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()

相关问题 更多 >