在SQLAlchemy查询中有多个语句

时间:2014-03-21 17:30:35

标签: python sql sqlalchemy

SQLAlechemy中的操作顺序是什么?理想的答案将提供一组通用的规则,而不是在特定示例的上下文中的解决方案。

这个问题的动机如下。我正在SQLite3数据库中的多个表中构建数据集。我的查询类似于以下内容:

query = session.query( Customer, Application, Income, Spending ).\
join(
    <USER-APPLICATION JOIN>
).\
join(
    <USER-INCOME JOIN>
).\
join(
    <USER-SPENDING JOIN>
).\
group_by(
    User.id,
    Application.date,
)

现在,我不想从这些表中提取所有内容,因此我在查询中添加了一些过滤器。例如:

query = query.\
filter( 
    Income.date <= Application.date
).\
having(
    or_(
        and_(
            func.max(Spending.date) <= Application.date,
            Spending.date == func.max(Spending.date)
        ),
        and_(
            func.max(Spending.date) > Application.date,
            Spending.date < Application.date
        ),
        and_(
            func.min(Spending.date) > Application.date,
            Spending.date == func.min(Spending.date)
        )
    )
).\
having(
    Spending.date == func.max(Spending.date),
    Income.date == func.max(Income.date)
)

但是,having语句依赖于彼此,并且只有在第二个语句之前应用第一个having语句时,上面的代码才会执行​​我想要的操作。

这段代码是否按我想要的方式运行?此外,此行为是否取决于我使用的数据库(我可能希望将来升级数据库)?

1 个答案:

答案 0 :(得分:3)

以下情况:

query.filter(...).having(...)

... filter()中的任何内容都成为WHERE子句的一部分,having()中的内容成为HAVING子句的一部分。

WHERE子句适用于预分组的行,HAVING子句适用于组。因此,HAVING子句将隐式地限定为传递WHERE子句的行。

因此,您的代码将按照写入的方式运行。