对象上的 Sqlalchemy 过滤器

Posted

技术标签:

【中文标题】对象上的 Sqlalchemy 过滤器【英文标题】:Sqlalchemy filter on object 【发布时间】:2017-07-14 11:59:25 【问题描述】:

我有一个脚本可以测试 SQLAlachemy ORM 驱动的数据库中对象的一些条件。这一切都是动态的,这给我带来了一些问题。

我想查询所有测试的最小对象数量,因此所有测试都有一个默认过滤。如果我要测试 2 个测试,则两个过滤器都将应用于查询,因此我得到的对象数量最少。

class Employee(Base):
    name = Column(String ...)
    account = Column(Account ...)
    coworkers = relationship(Employee_coworker, use_list=True ...)
    ...

所以当我得到所有对象时,我想使用我的 2 个过滤器

filter_1 = Employee.account != None
filter_2 = Employee.coworkers.any()
for e in session.query(Employee).filter(or_(filter_1, filter_2)).all():
    # IF e is here because of filter_1: 
    # Do something
    # IF e is here because of filter_2:
    # Do this thing
...

是否可以像过滤查询一样测试对象?

【问题讨论】:

您不能分别检查accountcoworker 成员是否符合您过滤它们的条件吗? 我看不出这怎么可能,没有再次重写条件(我尽量避免).. 在这种情况下,如果我理解正确,答案是否定的。数据库没有告诉你为什么它返回了它所做的记录。据我所知,SQLAlchemy 也不对此进行任何分析。 【参考方案1】:

您可以明确要求数据库告诉您匹配的内容:

filter1 = ...
filter2 = ...
filters = [filter1, filter2, ...]
query = session.query(Employee, *filters).filter(or_(*filters))
for employee, filter1_applied, filter2_applied, ... in query:
    ...

【讨论】:

以上是关于对象上的 Sqlalchemy 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

flask_sqlalchemy

flask-sqlalchemy的使用

SQlAlchemy的增删改查

在 SQLAlchemy 中以特定格式按日期分组

尝试连接数据库和 Web 容器时 SQLAlchemy 连接被拒绝

如何根据列的值过滤 SQLAlchemy 结果?