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

一对多关联查询优化:如何获取单条用户信息及关联全部银行账户

解决SQLAlchemy查询中用户信息重复、银行账户合并为列表的问题

方法1:利用SQLAlchemy ORM关系(推荐)

如果你的Users和UserLocalBankAccounts模型已经定义了一对多关联,直接通过ORM关系就能高效获取目标格式:

先确认模型关系定义(如果还没加的话):

class Users(Base):
    __tablename__ = 'users'
    UserId = Column(Integer, primary_key=True)
    FirstName = Column(String)
    LastName = Column(String)
    # 关联银行账户的一对多关系
    bank_accounts = relationship("UserLocalBankAccounts", back_populates="user")

class UserLocalBankAccounts(Base):
    __tablename__ = 'user_local_bank_accounts'
    id = Column(Integer, primary_key=True)
    RIB = Column(String)
    user_id = Column(Integer, ForeignKey('users.UserId'))
    # 反向关联用户
    user = relationship("Users", back_populates="bank_accounts")

然后查询并组装结果:

user = db.query(Users).filter(Users.UserId == 1).first()
result = {
    "FirstName": user.FirstName,
    "LastName": user.LastName,
    "RIBs": [account.RIB for account in user.bank_accounts]
}

最终结果格式:

{
    "FirstName": "X",
    "LastName": "Y",
    "RIBs": ["ABC123456789", "BZE123456789", "DFG123456789"]
}

方法2:用SQL聚合函数直接查询

根据数据库类型选择对应的聚合函数,直接在SQL层面完成分组聚合:

PostgreSQL(支持数组聚合)

from sqlalchemy import func

query_result = db.query(
    Users.FirstName,
    Users.LastName,
    func.array_agg(models.UserLocalBankAccounts.RIB).label('RIBs')
).join(models.UserLocalBankAccounts).filter(Users.UserId == 1).group_by(Users.UserId).first()

result = {
    "FirstName": query_result.FirstName,
    "LastName": query_result.LastName,
    "RIBs": query_result.RIBs
}

MySQL(使用字符串拼接后拆分)

from sqlalchemy import func

query_result = db.query(
    Users.FirstName,
    Users.LastName,
    func.group_concat(models.UserLocalBankAccounts.RIB).label('RIBs')
).join(models.UserLocalBankAccounts).filter(Users.UserId == 1).group_by(Users.UserId).first()

result = {
    "FirstName": query_result.FirstName,
    "LastName": query_result.LastName,
    "RIBs": query_result.RIBs.split(',') if query_result.RIBs else []
}

方法3:Python端处理原始查询结果

如果不想修改查询语句,直接在Python层合并重复数据:

raw_results = db.query(
    Users.FirstName,
    Users.LastName,
    models.UserLocalBankAccounts.RIB,
).join(models.UserLocalBankAccounts).filter(Users.UserId == 1).all()

if not raw_results:
    result = {}
else:
    result = {
        "FirstName": raw_results[0].FirstName,
        "LastName": raw_results[0].LastName,
        "RIBs": [item.RIB for item in raw_results]
    }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:15:52