小能豆

如何在sqlalchemy中创建子查询

python

SELECT *
FROM Residents
WHERE apartment_id IN (SELECT ID
                       FROM Apartments
                       WHERE postcode = 2000)

我正在使用 sqlalchemy 并尝试执行上述查询。我无法使用原始 SQL 来执行它,db.engine.execute(sql)因为它抱怨我的关系不存在…但我使用以下格式成功查询了我的数据库:session.Query(Residents).filter_by(???)。不过,我不知道如何用这种格式构建我想要的查询。


阅读 68

收藏
2024-05-15

共1个答案

小能豆

在 SQLAlchemy 中,您可以使用 ORM(对象关系映射)的方式执行所需的查询。您需要在您的 SQLAlchemy 模型中建立表之间的关系,然后可以使用这些关系来构建查询。

假设您已经为 ResidentsApartments 表定义了适当的 SQLAlchemy 模型,并在模型中定义了适当的关系,您可以像这样构建查询:

from sqlalchemy.orm import sessionmaker
from your_module import Residents, Apartments, engine

Session = sessionmaker(bind=engine)
session = Session()

# 假设通过 apartment_id 在 Residents 和 Apartments 之间建立了关系
query_result = session.query(Residents).\
    join(Apartments, Residents.apartment_id == Apartments.ID).\
    filter(Apartments.postcode == 2000).all()

# 现在您可以遍历 query_result 来访问 Resident 对象
for resident in query_result:
    print(resident)

确保您已经在 SQLAlchemy 模型中正确定义了关系。例如,您的 Residents 模型可能如下所示:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from your_module import Base

class Residents(Base):
    __tablename__ = 'Residents'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    apartment_id = Column(Integer, ForeignKey('Apartments.ID'))

    # 定义与 Apartments 表的关系
    apartment = relationship("Apartments", back_populates="residents")

    def __repr__(self):
        return f"<Resident(id={self.id}, name={self.name})>"

类似地,您的 Apartments 模型可能如下所示:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from your_module import Base

class Apartments(Base):
    __tablename__ = 'Apartments'

    ID = Column(Integer, primary_key=True)
    postcode = Column(Integer)
    residents = relationship("Residents", back_populates="apartment")

    def __repr__(self):
        return f"<Apartment(ID={self.ID}, postcode={self.postcode})>"

your_module 替换为您在其中定义了 SQLAlchemy 模型的适当模块,并确保您的模型已正确定义了适当的关系。然后,您应该能够成功执行查询。

2024-05-15