SQLAlchemy一对多关联统计24小时评论数报错排查
问题排查与解决:TypeError: cannot unpack non-iterable Task object
错误根源
你在get_comments_for_day里用了results.scalars().all(),这个方法只会提取查询结果的第一列数据——也就是Task对象。返回的列表里每个元素都是单个Task实例,不是你预期的(Task, comments_found)元组,循环时拆成两个变量自然报错。
修复步骤
- 替换结果获取方式:把
results.scalars().all()改成results.all(),这样就能拿到包含(Task实例, 评论数)的元组列表。 - 补充分组逻辑:子查询里漏掉了
group_by(Comment.task_id),不然会把所有符合条件的评论统计成一个总数,无法按task区分。
修改后的完整查询代码:
async def get_comments_for_day(): start_day = datetime.utcnow() - timedelta(hours=23, minutes=50) async with get_async_session() as session: # 子查询:按task_id分组统计24小时内的评论数 stmt = select(Comment.task_id, func.count(Comment.task_id).label('comments_found'))\ .where(Comment.date >= start_day)\ .group_by(Comment.task_id)\ .subquery() # 关联Task表,左连接保证没有评论的Task也能被查出 main_stmt = select(Task, stmt.c.comments_found).outerjoin(stmt, Task.id == stmt.c.task_id) results = await session.execute(main_stmt) return results.all() async def main(): tasks = await get_comments_for_day() for task, comments_found in tasks: # 处理没有评论的Task,默认显示0 print(task.name, comments_found or 0)
额外修正点
你的Comment模型中date字段的默认值设置有误:
# 错误写法:类定义时就执行utcnow(),所有新Comment会用同一个固定时间 date = Column(DateTime, default=datetime.datetime.utcnow())
改成传入函数本身,让SQLAlchemy每次创建实例时自动生成当前时间:
date = Column(DateTime, default=datetime.datetime.utcnow)
内容的提问来源于stack exchange,提问作者nnekkitt
相关产品推荐
相关产品推荐

