Python 您可以在SQLAlchemy中为关系join的on子句添加条件吗?
假设我有以下两个SQLAlchemy ORM类:Python 您可以在SQLAlchemy中为关系join的on子句添加条件吗?,python,sql-server,sqlalchemy,Python,Sql Server,Sqlalchemy,假设我有以下两个SQLAlchemy ORM类: import sqlalchemy as sa class Address(Base): __tablename__ = 'DimAddress' AddressKey = sa.Column(sa.Integer, primary_key=True) # ... columns ... class DealerOrganisation(Base): __tablename__ = 'DimDealerOrg
import sqlalchemy as sa
class Address(Base):
__tablename__ = 'DimAddress'
AddressKey = sa.Column(sa.Integer, primary_key=True)
# ... columns ...
class DealerOrganisation(Base):
__tablename__ = 'DimDealerOrganisation'
DealerOrganisationKey = sa.Column(sa.Integer, primary_key=True)
# ... columns ...
DealerOrganizationAddressKey = sa.Column(sa.Integer, sa.ForeignKey('DimAddress.AddressKey'), nullable=False)
# ... columns ...
address = relationship('Address')
我可以获得经销商组织及其地址(如有),如下所示:
session = Session()
query = session.query(DealerOrganisation).outerjoin(DealerOrganisation.address).options(contains_eager(DealerOrganisation.address))
这给了我大致如下的SQL:
SELECT *
FROM DimDealerOrganisation
LEFT JOIN DimAddress ON AddressKey = DealerOrganizationAddressKey
但是,如果我只想对相关对象的子集执行ORM查询,该怎么办
SELECT *
FROM DimDealerOrganisation
LEFT JOIN DimAddress ON AddressKey = DealerOrganizationAddressKey AND ZipCode = '90210'
也就是说,我想要所有的经销商,但如果邮政编码是90210,我只想要他们的地址。据我所知,join()和outerjoin()允许您指定关系或显式条件,但不能同时指定两者。在这个人为设计的示例中,我可以使用显式条件来获取行而不是ORM对象,但在涉及多个表和一对多关系的实际查询中,这将是非常笨拙的。我想向on子句添加附加条件,但仍然让它填充返回的DealOrganization对象的
address
属性。这可能吗?您将要在联接中使用。我想它看起来会像:
session = Session()
session.query(Table1).join(Table2, and_(Table1.address==Table2.address, Table1.zip == '90210'), isouter=True)
您将要在联接中使用。我想它看起来会像:
session = Session()
session.query(Table1).join(Table2, and_(Table1.address==Table2.address, Table1.zip == '90210'), isouter=True)
为了使我的问题简洁明了,我无意中使用了一个不代表我的确切情况的示例,但这帮助我找到了答案。在我的实际场景中,我对同一个表有多个关系。我想知道,如果我像在这个答案中那样使用显式连接条件,SQLAlchemy如何知道哪种关系与哪种连接相关?事实证明,您只需使用别名并将相同的别名传递给outerjoin()和contains_eager()的alias关键字参数,SQLAlchemy就会解决这个问题。为了使我的问题简洁,我无意中使用了一个不代表我的确切场景的示例,但这帮助我找到了答案。在我的实际场景中,我对同一个表有多个关系。我想知道,如果我像在这个答案中那样使用显式连接条件,SQLAlchemy如何知道哪种关系与哪种连接相关?事实证明,您只需使用别名并将相同的别名传递给outerjoin()和contains_eager()的alias关键字参数,SQLAlchemy就会解决这个问题。