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

如何用SQLAlchemy按两个字段对对象列表进行去重?

用SQLAlchemy实现按字段去重的方案

完全可以通过SQLAlchemy在数据库层面完成去重,不需要在返回的列表里做额外处理,以下是两种常用方案:

1. 直接返回去重后的字段组合(无需保留ID)

如果只需要title、date、flag这些重复字段的唯一组合,不需要id,可以用distinct()指定去重字段:

event_get = Event.query.filter(Event.flag == 1).distinct(Event.title, Event.date)
result = events_schema.dump(event_get)
data = dict(event=result)

这个方法会让数据库直接返回title和date唯一的记录,性能比先查全量再去重更优。

2. 保留每组中的某一条完整记录(比如最小ID的记录)

如果需要保留完整的记录(包含id),但每组只留一条(比如取每组中id最小的),可以通过子查询+关联的方式实现:

from sqlalchemy import func

# 子查询:按title和date分组,获取每组的最小id
subquery = db.session.query(
    func.min(Event.id).label('min_id')
).filter(Event.flag == 1).group_by(Event.title, Event.date).subquery()

# 关联原表,只取id等于子查询中min_id的记录
event_get = Event.query.join(subquery, Event.id == subquery.c.min_id)
result = events_schema.dump(event_get)
data = dict(event=result)

这种方式能确保返回的是每组中特定的一条完整记录,适合需要保留主键或其他唯一标识的场景。

为什么不推荐在Python层面去重?

如果先查询所有记录再在Python列表中去重,当数据量较大时,会占用更多内存,且数据库层面的去重效率远高于应用层处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:40:42