如何在Flask-SQLAlchemy中按当前日期过滤查询并解决运行报错
Flask-SQLAlchemy日期过滤报错修复方案
错误原因排查
你的代码存在4处核心问题,都是导致报错的直接原因:
- 语法误用:
filter_by()仅支持等于匹配的查询条件,不支持>=这类比较运算符,涉及范围比较需要改用filter()方法 - 字段名错误:你的
Ads模型中没有名为date的字段,存储发布时间的字段是post_on,直接调用不存在的字段会触发属性不存在报错 - 变量名不匹配:你提前定义了存储当前时间的变量
current_time,但查询时用了未定义的current_date,触发变量未定义报错 - 转义字符问题:代码中的
date>=是HTML转义后的内容,实际代码中要写成普通的>=
修复后的代码
查询部分修改:
if selected_page == 'electronics': # 直接用SQLAlchemy内置func.now()取数据库当前时间,避免Python时区和数据库时区不一致问题 imb = Ads.query.filter( Ads.category == 'electronics', Ads.post_on >= func.now() ).paginate(per_page=20, page=page, error_out=True) return render_template('electronics.html', imb=imb, prmo=prmo)
可选:仅按日期过滤(忽略时分秒)
如果你需要只比较日期、不限制具体时间,可以用func.date()转换字段后再匹配:
imb = Ads.query.filter( Ads.category == 'electronics', func.date(Ads.post_on) >= func.current_date() ).paginate(per_page=20, page=page, error_out=True)
额外注意事项
你的post_on字段设置了timezone=True带时区属性,尽量使用数据库层面的时间函数(func.now()/func.current_date())获取当前时间,不要用Python的datetime.now(),避免两者时区不一致导致过滤结果不符合预期。
内容的提问来源于stack exchange,提问作者Kelvin Jones
相关产品推荐
相关产品推荐

