如何关联含int[]外键列的表并输出JSON格式嵌套查询结果
嘿,我来帮你搞定这个关联表生成嵌套JSON的问题!你需要把Group表中存储的scope_id数组,替换成Scope表中对应的完整对象列表,最终生成指定结构的JSON对吧?下面我给你几种实用的实现方案:
方案1:Python 手动关联(适合小型脚本/快速验证)
如果是用Python处理,可以先把两张表的数据查出来,再通过字典映射快速关联,步骤很直观:
# 模拟从数据库查询到的Group数据(实际项目中替换成数据库查询语句) groups = [ {"id": 1, "name": "admin", "description": None, "scope_id": [1, 2]} ] # 模拟从数据库查询到的Scope数据 scopes = [ {"id": 1, "name": "default", "color": "primary"}, {"id": 2, "name": "admin", "color": "secondary"} ] # 先把Scope数据转成ID为键的字典,方便后续快速查找 scope_map = {scope["id"]: scope for scope in scopes} # 处理Group数据,替换scope_id为对应的Scope对象列表 processed_groups = [] for group in groups: processed_group = group.copy() # 根据ID列表匹配对应的Scope对象 processed_group["scope_id"] = [scope_map[sid] for sid in group["scope_id"]] processed_groups.append(processed_group) # 转成目标JSON格式 import json print(json.dumps(processed_groups[0], indent=2))
运行后就能得到你想要的结果:
{ "id": 1, "name": "admin", "description": null, "scope_id": [ { "id": 1, "name": "default", "color": "primary" }, { "id": 2, "name": "admin", "color": "secondary" } ] }
方案2:用SQL直接生成JSON(适合数据库支持JSON函数的场景,比如PostgreSQL)
如果你的数据库是PostgreSQL这类支持JSON函数的,可以直接在SQL层面完成关联和JSON生成,不需要额外代码处理:
SELECT g.id, g.description, g.name, json_agg( json_build_object( 'id', s.id, 'name', s.name, 'color', lower(s.color) -- 统一转成小写,和你的目标格式匹配 ) ) AS scope_id FROM "Group" g JOIN "Scope" s ON s.id = ANY(g.scope_id) WHERE g.id = 1 -- 指定要查询的Group ID GROUP BY g.id, g.description, g.name;
执行这条SQL后,数据库会直接返回你需要的嵌套JSON结构。
方案3:ORM关联查询(比如SQLAlchemy,适合中大型项目)
如果你的项目用了ORM框架(比如SQLAlchemy),可以通过模型定义和关联查询来实现:
from sqlalchemy import create_engine, Column, Integer, String, ARRAY from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() # 定义Group模型 class Group(Base): __tablename__ = 'Group' id = Column(Integer, primary_key=True) name = Column(String) description = Column(String) scope_id = Column(ARRAY(Integer)) # 定义Scope模型 class Scope(Base): __tablename__ = 'Scope' id = Column(Integer, primary_key=True) name = Column(String) color = Column(String) # 初始化数据库连接(替换成你的数据库地址) engine = create_engine('postgresql://user:password@localhost/dbname') Session = sessionmaker(bind=engine) session = Session() # 查询目标Group及对应的Scope记录 target_group = session.query(Group).filter_by(id=1).first() related_scopes = session.query(Scope).filter(Scope.id.in_(target_group.scope_id)).all() # 构建目标结构 result = { "id": target_group.id, "description": target_group.description, "name": target_group.name, "scope_id": [{"id": s.id, "name": s.name, "color": s.color.lower()} for s in related_scopes] } # 转成JSON import json print(json.dumps(result, indent=2))
内容的提问来源于stack exchange,提问作者Jessica Resnick




