SQLAlchemy:按关系过滤

时间:2015-06-15 06:23:31

标签: python sqlalchemy

我有两个表UserObject,它们具有一对多的关系(User可以有多个objects。)

如何以符合pep8的方式过滤具有至少一个对象的用户?

此代码有效,但不符合pep8:

query = session.query(User.id)
query = query.filter(User.objects != None)

文档使用isnothttp://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#common-filter-operators

提及

但是下面的代码会导致一个未实现的错误。

query = session.query(User.id)
query = query.filter(User.objects.isnot(None))

2 个答案:

答案 0 :(得分:6)

正如您所指出的,isnot并未针对关系实现,而是仅针对简单列。

至于关系,有一个更强大的一般构造any(criterion, ...)

在您的情况下,您可以在下面编写符合PEP8标准的代码,它会产生与您的问题完全相同的SQL

q = session.query(User.id)
q = q.filter(User.objects.any())

但它也允许您执行更复杂的查询,例如:返回用户,包含value > 100 的对象:

q = session.query(User.id)
q = q.filter(~User.objects.any(Object.value > 100))

答案 1 :(得分:-3)

您可能知道,在Django中,可以在simple, declarative way中完成此类过滤:

Entry.objects.filter(blog__name='Beatles Blog')

我一直梦想在SQLAlchemy中有这样的东西。

好消息:几周前,我为此创建了https://github.com/absent1706/sqlalchemy-mixins#django-like-queries

此外,软件包还包含非常有用的电池: SQLAlchemy的Active Record 以及嵌套的预先加载且可读__repr__