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

如何将含NOT IN子句的SQL查询转换为SQLAlchemy代码?

正确实现目标SQL的SQLAlchemy代码

ORM 查询方式

假设你的模型类定义如下(字段名请和实际数据库表保持一致):

from sqlalchemy import Column, Integer
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class AvailabilitySchedule(Base):
    __tablename__ = "Availability_Schedule"
    Schedule_ID = Column(Integer, primary_key=True)
    Staff_ID = Column(Integer)
    # 补充你的其他业务字段

class Appointments(Base):
    __tablename__ = "Appointments"
    Schedule_ID = Column(Integer)
    Status = Column(Integer)
    # 补充你的其他业务字段

正确的查询实现:

from sqlalchemy import select
# 假设已初始化好数据库会话session

# 构造子查询:获取状态为1的预约对应的Schedule_ID
subquery = select(Appointments.Schedule_ID).where(Appointments.Status == 1)

# 主查询:筛选指定员工且未被预约的日程
query = select(AvailabilitySchedule).where(
    AvailabilitySchedule.Schedule_ID.not_in(subquery),
    AvailabilitySchedule.Staff_ID == 1
)

# 执行查询并获取结果
results = session.execute(query).scalars().all()

SQLAlchemy Core 查询方式

如果使用Core而非ORM,代码如下:

from sqlalchemy import MetaData, Table, Column, Integer, select

metadata = MetaData()

# 定义表结构
availability_schedule = Table(
    "Availability_Schedule", metadata,
    Column("Schedule_ID", Integer, primary_key=True),
    Column("Staff_ID", Integer),
    # 补充其他字段
)

appointments = Table(
    "Appointments", metadata,
    Column("Schedule_ID", Integer),
    Column("Status", Integer),
    # 补充其他字段
)

# 子查询
subquery = select(appointments.c.Schedule_ID).where(appointments.c.Status == 1)

# 主查询
query = select(availability_schedule).where(
    availability_schedule.c.Schedule_ID.not_in(subquery),
    availability_schedule.c.Staff_ID == 1
)

# 执行查询(假设已创建engine)
with engine.connect() as conn:
    results = conn.execute(query).fetchall()

核心注意事项

  • not_in()方法可直接传入子查询对象,无需额外处理
  • 必须保证模型/表对象的字段名与数据库表字段完全匹配(包括大小写、下划线)
  • 若子查询返回空结果,SQLAlchemy会自动兼容原生SQL的NOT IN逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:10:35