You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何关联含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

火山引擎 最新活动