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

使用SQLAlchemy实现三表嵌套JOIN查询获取第三表ID的方法问询

前提说明

首先需要你提前定义好三张表对应的ORM映射类,字段属性、关联关系和实际表结构一致即可,参考示例如下:

from sqlalchemy import Column, Integer, ForeignKey, String
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class TableOne(Base):
    __tablename__ = "table_one"
    id = Column(Integer, primary_key=True)
    # 其他字段按需补充

class TableTwo(Base):
    __tablename__ = "table_two"
    id = Column(Integer, primary_key=True)
    table_one_id = Column(Integer, ForeignKey("table_one.id"))
    external_id = Column(String) # 字段类型可根据实际情况调整

class TableThree(Base):
    __tablename__ = "table_three"
    id = Column(Integer, primary_key=True)
    table_two_id = Column(Integer, ForeignKey("table_two.id"))
    external_id = Column(String) # 字段类型可根据实际情况调整

SQLAlchemy 2.0 写法(当前主流推荐版本)

from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session

# 替换为实际的数据库连接串
engine = create_engine("mysql+pymysql://user:password@host:port/db_name")

# 替换为实际查询参数
x = 1
y = "external_id_y_value"
z = "external_id_z_value"

with Session(engine) as session:
    stmt = select(TableThree.id)\
        .join(TableTwo, TableThree.table_two_id == TableTwo.id)\
        .join(TableOne, TableTwo.table_one_id == TableOne.id)\
        .where(
            TableOne.id == x,
            TableTwo.external_id == y,
            TableThree.external_id == z
        )
    # 取单个结果用scalar,取多条匹配结果用scalars().all()
    result = session.scalar(stmt)

SQLAlchemy 1.x 旧版本写法

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 替换为实际的数据库连接串
engine = create_engine("mysql+pymysql://user:password@host:port/db_name")
Session = sessionmaker(bind=engine)
session = Session()

# 替换为实际查询参数
x = 1
y = "external_id_y_value"
z = "external_id_z_value"

result = session.query(TableThree.id)\
    .join(TableTwo, TableThree.table_two_id == TableTwo.id)\
    .join(TableOne, TableTwo.table_one_id == TableOne.id)\
    .filter(
        TableOne.id == x,
        TableTwo.external_id == y,
        TableThree.external_id == z
    ).first()
# 最终取值
target_id = result[0] if result else None

补充说明

你给出的原生SQL嵌套JOIN逻辑和上述顺序JOIN写法完全等价,SQLAlchemy生成的执行SQL和需求一致,如果你需要校验生成的SQL是否正确,直接打印stmt对象(2.0版本)或者query对象(1.x版本)即可查看。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:54:04