You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化SQLAlchemy查询结果按字段分组的循环代码

优化思路与实现方案

1. 使用collections.defaultdict简化字典操作

原代码中需要手动判断分类是否存在,用defaultdict可以自动初始化空列表,省去判断逻辑,让循环代码更简洁:

from collections import defaultdict

skills = db.query(model.Skill).order_by(model.Skill.category).all()

_categories = defaultdict(list)
for skill in skills:
    _categories[skill.category].append({"name": skill.name, "img_path": skill.img_path})

# 转换为目标格式的列表
result = [{"category": cat, "skills": skills_list} for cat, skills_list in _categories.items()]

2. 利用SQLAlchemy在数据库层面分组(适合大数据量场景)

如果数据量较大,把分组逻辑交给数据库处理能减少应用层的内存消耗,结合SQL的聚合函数直接构造需要的结构:

from sqlalchemy import func

# 构造单个技能的字典结构
skill_struct = func.json_build_object(
    'name', model.Skill.name,
    'img_path', model.Skill.img_path
)

# 按category分组并聚合技能数据
query = db.query(
    model.Skill.category,
    func.array_agg(skill_struct).label('skills')
).group_by(model.Skill.category).order_by(model.Skill.category)

# 直接转换为目标格式
result = [row._asdict() for row in query.all()]

这种方式将分组计算转移到数据库,应用层仅需转换结果格式,性能表现更优。

3. 使用itertools.groupby实现分组

由于原查询已经按category排序,itertools.groupby可以直接对连续相同分类的项进行分组,代码更具Python风格:

from itertools import groupby
from operator import attrgetter

skills = db.query(model.Skill).order_by(model.Skill.category).all()

result = []
for category, group in groupby(skills, key=attrgetter('category')):
    result.append({
        "category": category,
        "skills": [{"name": s.name, "img_path": s.img_path} for s in group]
    })

groupby会自动将同分类的连续项归为一组,配合排序后的查询结果,代码简洁直观。


内容的提问来源于stack exchange,提问作者hycv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:01:12