You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLAlchemy查询中适配None类型的日期比较?

过滤SQL中NULL记录并保留时间比较条件的解决方案

原查询代码

abandoned_days = 10
abandoned_date = datetime.now() - timedelta(days=abandoned_days)

abandoned_requests = db.query(models.DocumentRequest)\
    .filter(
        models.DocumentRequest.case_id.in_([case["id"] for case in cases]),
        models.DocumentRequest.status == 'requested',
        models.DocumentRequest.requested_at < abandoned_date) \
    .all()

报错信息

TypeError: '<' not supported between instances of 'NoneType' and 'datetime.datetime'

问题需求

abandoned_date始终为datetime类型,需调整查询逻辑,既排除requested_at为None(对应SQL中的NULL)的记录,又保留requested_at < abandoned_date的时间筛选条件。

解决方法

在查询的filter中新增requested_at.isnot(None)条件,先过滤掉NULL值记录,再进行时间比较:

abandoned_days = 10
abandoned_date = datetime.now() - timedelta(days=abandoned_days)

abandoned_requests = db.query(models.DocumentRequest)\
    .filter(
        models.DocumentRequest.case_id.in_([case["id"] for case in cases]),
        models.DocumentRequest.status == 'requested',
        models.DocumentRequest.requested_at.isnot(None),  # 排除requested_at为NULL的记录
        models.DocumentRequest.requested_at < abandoned_date) \
    .all()

原理说明

数据库中requested_at为NULL时,会被SQLAlchemy映射为Python的None,直接与datetime类型的abandoned_date比较会触发类型错误。新增isnot(None)条件后,会先筛选出所有requested_at有有效时间值的记录,后续的时间比较操作就能正常执行。

内容的提问来源于stack exchange,提问作者personwholikestocode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:18:59