一对多关联查询优化:如何获取单条用户信息及关联全部银行账户
解决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
相关产品推荐
相关产品推荐

