【问题标题】:Is it possible in SQLAlchemy to filter by a database function or stored procedure?SQLAlchemy 中是否可以通过数据库函数或存储过程进行过滤?
【发布时间】:2013-10-22 11:50:09
【问题描述】:

我们在一个带有旧数据库的项目中使用 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()

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

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

谢谢,

【问题讨论】:

    标签: python sql-server sqlalchemy


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2016-07-30
      • 2017-06-27
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多