如何将含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
相关产品推荐
相关产品推荐

