【问题标题】:sqlalchemy only apply filter if value is not Nonesqlalchemy 仅在值不是 None 时应用过滤器
【发布时间】:2020-04-21 14:33:08
【问题描述】:

我正在创建一个 sqlalchemy 过滤器,用于查找特定时间范围之间的行,但我只希望在它们具有当天的值时应用此过滤器。如果他们不这样做,他们也应该被退回。过滤器如下所示:

 models = {
        CheckinAction: Student.person_id == CheckinAction.person_id,
        CheckinTimeRange: CheckinAction.chk_checkin_time_range_id == CheckinTimeRange.pk,
    }

    return join_models(query, models, "outerjoin").filter(
        CheckinTimeRange.day >= pendulum.parse(start_day).date(), CheckinTimeRange.day <= pendulum.parse(end_day).date()
    )

在上面的代码中,CheckinAction 和 CheckinTimeRange 模型外连接到现有的 Student 查询。如果他们有签入操作,我只想应用 CheckinTimeRange.day 过滤器。一个例子是:

row #1: {
student_id = 1,
student_name = 'row_to_not_filter',
checkin_action = None,
checkin_time_range = None
}

row #2: {
student_id = 2,
student_name = 'row_to_filter',
checkin_action = some_object,
checkin_time_range = {day = '2020-04-21'}
}

我只想将过滤器应用于第二行,因为它们有一个 checkin_time_range。

【问题讨论】:

  • “没有 ...day 值”是指他们的日期为 NULL?
  • 是的。此过滤器位于对 CheckinTimeRange 执行外连接的较大查询上。 fitler 正在过滤出他们在 checkinTimeRange 中为 NULL 的位置,但我想返回所有内容。基本上只希望在有 timeRange 的情况下应用过滤器。
  • 这是重要信息,请编辑问题以包含该事实和更好的查询示例。原因是在这种情况下,您可以考虑将谓词移动到连接的 ON 子句。
  • 当然!我更新了问题,这样更有意义吗?

标签: python sqlalchemy


【解决方案1】:

由于您使用的是 LEFT JOIN,因此将谓词移动到连接的 ON 子句:

from sqlalchemy import and_

...
    models = {
        CheckinAction: Student.person_id == CheckinAction.person_id,
        CheckinTimeRange: and_(
            CheckinAction.chk_checkin_time_range_id == CheckinTimeRange.pk,
            CheckinTimeRange.day >= pendulum.parse(start_day).date(),
            CheckinTimeRange.day <= pendulum.parse(end_day).date()
        )
    }

    return join_models(query, models, "outerjoin")

因为CheckinAction.chk_checkin_time_range_id 用于与CheckinTimeRange 的联接的ON 子句中,所以如果缺少操作,AND 将在第1 行计算为NULL,从而实现不包括时间范围的结果。将范围谓词移动到 ON 子句也可以将完全没有范围的行包含在结果中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多