如何在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
相关产品推荐
相关产品推荐

