设计更智能的查询方法。专为目前检索目的的查询是:SQLAlchemy中的.join()和.has()/ .any()之间的区别
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()
的查询方法,以及为什么它更好。 [版本:2.7.9的Python和SQLAlchemy的1.0.9]
基础上docs:
Query.join()
推荐的形式:
如果没有外键或几个查询。 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关键字是一个布尔运算符,如果 给定表达式包含任何行返回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')
这与SQLAlchemy无关,这是提问者特别要求的内容。 – DNelson