如何查找SQLAlchemy对象中created_at大于指定时间的首个条目
代码存在的问题
你用生成器配合next()查找首个匹配项的实现思路是正确的,匹配失败/报错的核心原因出在三个细节上:
- 时间解析格式和实际值不匹配:你给出的样例数据中
created_at字符串的格式为2022-06-10 12:00:00,日期和时间之间是半角空格,但你传给strptime的格式串是%Y-%m-%dT%H:%M:%S,硬编码了字符T作为日期和时间的分隔符,解析时会直接抛出ValueError: time data 'xxx' does not match format错误,根本走不到时间比较的逻辑。 - 多余的类型转换操作:你明确说明
created_at是SQLAlchemy映射的datetime类型字段,这种场景下从数据集中拿到的v['created_at']本身就是datetime类实例,不需要再调用strptime()做字符串转时间的处理。strptime方法要求第一个参数必须是字符串类型,传入datetime对象会直接触发类型错误。只有当你拿到的是序列化后的JSON字符串数据时,才需要做这一步解析。 - 时间对象时区属性不一致:就算修正了前面两个问题,如果你的
startTime是带时区信息的offset-aware类型时间,而从数据库取出/字符串解析出的created_at是不带时区的offset-naive类型时间,两者做大小比较时会抛出类型错误,需要在比较前统一两者的时区配置。
修正后代码参考
场景1:
created_at是SQLAlchemy返回的原生datetime类型(最常见的情况)# 提前确保startTime和数据库返回时间的时区属性一致 startPos = next((i for i, v in enumerate(hardware['data']) if v['created_at'] > startTime), None)
场景2:
created_at是和样例一致的字符串类型from datetime import datetime startPos = next( (i for i, v in enumerate(hardware['data']) if datetime.strptime(v['created_at'], '%Y-%m-%d %H:%M:%S') > startTime), None )
内容的提问来源于stack exchange,提问作者The Candy King
相关产品推荐
相关产品推荐

