设计更智能的查询方法。目前用于检索目的的查询是:
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')