如何用SQLAlchemy ORM实现嵌套查询:通过用户ID获取组织名称
用SQLAlchemy ORM实现跨表查询组织名称
1. 先定义ORM模型类
首先对应三个数据表定义模型,并建立关联关系,让ORM识别表间的关联逻辑:
from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy import create_engine # 初始化ORM基础类 Base = declarative_base() class User(Base): __tablename__ = 'user_table' id = Column(Integer, primary_key=True) domain_id = Column(Integer, ForeignKey('domain_table.id')) # 关联Domain表,反向关联由Domain的users字段维护 domain = relationship("Domain", back_populates="users") class Domain(Base): __tablename__ = 'domain_table' id = Column(Integer, primary_key=True) organization_id = Column(Integer, ForeignKey('organization_table.id')) # 关联User和Organization表 users = relationship("User", back_populates="domain") organization = relationship("Organization", back_populates="domains") class Organization(Base): __tablename__ = 'organization_table' id = Column(Integer, primary_key=True) name = Column(String) # 关联Domain表 domains = relationship("Domain", back_populates="organization")
2. 实现查询的两种方式
方式一:利用ORM关联关系(推荐,更符合ORM风格)
通过模型间的关联链直接导航,或用JOIN查询直接获取目标字段:
# 初始化数据库连接和session(替换为你的数据库连接串) engine = create_engine('your_database_connection_url') Session = sessionmaker(bind=engine) session = Session() user_id = 123 # 给定的用户ID # 方式1-1:通过对象导航获取名称 user = session.query(User).get(user_id) if user and user.domain and user.domain.organization: org_name = user.domain.organization.name print(org_name) # 方式1-2:用JOIN直接查询(无需加载完整对象,性能更优) org_name = session.query(Organization.name)\ .join(Domain, Domain.organization_id == Organization.id)\ .join(User, User.domain_id == Domain.id)\ .filter(User.id == user_id)\ .scalar() # 获取单个结果值 print(org_name)
方式二:模拟原SQL的子查询逻辑
如果需要严格匹配你给出的嵌套子查询SQL结构,可以这样实现:
user_id = 123 # 子查询:获取用户对应domain的organization_id subquery = session.query(Domain.organization_id)\ .filter(Domain.id == session.query(User.domain_id).filter(User.id == user_id))\ .subquery() # 主查询:根据organization_id获取组织名称 org_name = session.query(Organization.name)\ .filter(Organization.id == subquery.c.organization_id)\ .scalar() print(org_name)
说明
- 方式一利用ORM的关联特性,代码简洁易读,SQLAlchemy会自动生成高效的JOIN语句。
- 方式二完全对应原生SQL的子查询逻辑,适合需要严格匹配原有SQL写法的场景。
内容的提问来源于stack exchange,提问作者kent
相关产品推荐
相关产品推荐

