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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:53