Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 您可以在SQLAlchemy中为关系join的on子句添加条件吗?_Python_Sql Server_Sqlalchemy - Fatal编程技术网

Python 您可以在SQLAlchemy中为关系join的on子句添加条件吗?

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

假设我有以下两个SQLAlchemy ORM类:

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就会解决这个问题。