如何用SQLAlchemy实现PostgreSQL关联库中无互阻Tods记录查询
解决方案:SQLAlchemy实现双向未屏蔽的Tods查询
要实现这个需求,核心是通过NOT EXISTS子查询排除存在单向屏蔽关系的记录,同时筛选出su_id为空的Tods行。假设当前要填充su_id的用户ID为current_user_id,具体查询代码如下:
from sqlalchemy import exists # 替换为实际的当前用户ID current_user_id = 123 valid_tods = session.query(Tods).filter( # 筛选su_id为空的待处理记录 Tods.su_id.is_(None), # 当前用户未屏蔽fu_id对应的用户:无当前用户作为屏蔽者、fu_id作为被屏蔽者的记录 ~exists().where( (Blocks.blocker == current_user_id) & (Blocks.blocked == Tods.fu_id) ), # fu_id对应的用户未屏蔽当前用户:无fu_id作为屏蔽者、当前用户作为被屏蔽者的记录 ~exists().where( (Blocks.blocker == Tods.fu_id) & (Blocks.blocked == current_user_id) ) ).all()
代码说明:
Tods.su_id.is_(None):先过滤出还未分配第二个用户的待处理Tods记录;- 第一个
~exists:校验Blocks表中不存在当前用户屏蔽fu_id用户的记录,确保当前用户没有屏蔽对方; - 第二个
~exists:校验Blocks表中不存在fu_id用户屏蔽当前用户的记录,确保对方也没有屏蔽当前用户; - 三个条件同时满足,即可得到符合业务要求的Tods行。
内容的提问来源于stack exchange,提问作者HadiH2o
相关产品推荐
相关产品推荐

