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语句时,上面的代码才会执行我想要的操作。
这段代码是否按我想要的方式运行?此外,此行为是否取决于我使用的数据库(我可能希望将来升级数据库)?
答案 0 :(得分:3)
以下情况:
query.filter(...).having(...)
... filter()
中的任何内容都成为WHERE子句的一部分,having()
中的内容成为HAVING子句的一部分。
WHERE子句适用于预分组的行,HAVING子句适用于组。因此,HAVING子句将隐式地限定为传递WHERE子句的行。
因此,您的代码将按照写入的方式运行。