如何在Flask框架中使用SQLAlchemy查询获取上个月的业务数据
解决方案
1. 依赖准备(可选)
如果需要更简便的相对日期计算,可以先安装python-dateutil库,用于快速计算上月日期范围:
pip install python-dateutil
如果不想额外安装依赖,也可以使用Python原生datetime模块实现,下文会给出两种实现方案。
2. 路由代码修改
只需要替换原路由中的数据查询逻辑即可,前端模板不需要额外调整,因为传递给模板的变量名仍然是buys,原有渲染逻辑可以直接复用:
用python-dateutil实现(更简洁)
from datetime import datetime from dateutil.relativedelta import relativedelta @app.route('/') @register_breadcrumb(app, '.', 'Home') def home(): # 计算上月时间边界 today = datetime.today() # 上个月第一天 00:00:00 first_day_of_last_month = (today - relativedelta(months=1)).replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 本月第一天 00:00:00,作为上月的结束边界 first_day_of_current_month = today.replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 筛选区间为[上月第一天, 本月第一天)的所有数据 buys = Buy.query.filter(Buy.date >= first_day_of_last_month, Buy.date < first_day_of_current_month).all() return render_template('home.html', buys=buys, title='home page')
用原生datetime实现(无额外依赖)
from datetime import datetime, timedelta @app.route('/') @register_breadcrumb(app, '.', 'Home') def home(): today = datetime.today() # 计算上月最后一天 last_day_of_last_month = today.replace(day=1) - timedelta(days=1) # 上月第一天 00:00:00 first_day_of_last_month = last_day_of_last_month.replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 本月第一天作为结束边界 first_day_of_current_month = today.replace(day=1, hour=0, minute=0, second=0, microsecond=0) buys = Buy.query.filter(Buy.date >= first_day_of_last_month, Buy.date < first_day_of_current_month).all() return render_template('home.html', buys=buys, title='home page')
3. 注意事项
- 如果项目有时区配置要求,不要直接使用
datetime.today(),替换为对应时区的时间生成方法,避免时差导致的筛选错误 - 这里采用左闭右开的区间筛选逻辑,避免漏掉上月最后一天23:59:59到本月第一天0点之间的毫秒级数据,比计算上月最后一天的23:59:59的方案更严谨
- Buy模型的date字段本身就是DateTime类型,不需要额外做类型转换,SQLAlchemy会自动完成和数据库字段的匹配
内容的提问来源于stack exchange,提问作者sendous
相关产品推荐
相关产品推荐

