SQLAlchemy中.join()和.has()/ .any()之间的区别

时间:2015-11-19 16:16:10

标签: python join sqlalchemy many-to-many rdbms

设计更智能的查询方法。目前用于检索目的的查询是:

query_retrieve = self.session.query(Assessment_Result).\
            filter(Assessment_Result.owner.has(User.username == owner)).\
            filter(Assessment_Result.assessment.has(Assessment.name == assessment)).one()

使用SQLAlchemy的EXISTS关键字。这在运行nosetests时有效,但稍后会出现问题。我需要使用.join()设计更好的查询方法,该方法执行相同类型的比较并返回.one()。更重要的是,我想更好地理解为什么.join()方法是一种有效的查询方法。

我花了一些时间尝试细分SQLAlchemy文档并发现以下信息很有用,但可以在使用.join()设计查询方法时使用更多帮助以及为什么它更好。 [版本:Python 2.7.9和SQLAlchemy 1.0.9]

基于docs

Query.join()推荐表格:

  

如果没有外键或几个外键,Query.join()效果更好   当使用以下表格之一时:

query.join(Address, User.id==Address.user_id)    # explicit condition
query.join(User.addresses)                       # specify relationship from left to right
query.join(Address, User.addresses)              # same, with explicit target
query.join('addresses')                          # same, using a string

布尔运算符:.has().any()(我上面的代码)

  

SQL中的EXISTS关键字是一个布尔运算符,如果返回True,则返回True   给定的表达式包含任何行。它可能会用在很多方面   场景代替连接,也可用于定位行   在相关表中没有相应的行。

表设计:

class Assessment_Result(Base):
    __tablename__ = 'assessment_results'

    owner_id = Column(Integer, ForeignKey('users.id'))
    owner = relationship('User', backref='assessment_result')

    assessment_id = Column(Integer, ForeignKey('assessments.id'))
    assessment = relationship('Assessment', backref='assessment_result')

0 个答案:

没有答案