SQLAlchemy - "动态过滤器"

Lor*_*ssi 6 python sqlite sqlalchemy dynamic filter

我刚开始使用SQLAlchemy.我决定使用它,因为我在sqlite查询中使用了很多字符串表达式.

所以,这是我的问题.我有一张桌子,里面有许多设备,每个设备都有维护等级的日期.关键是用户可以选择他想要在屏幕上看到的维护级别.因此,我应该为他选择的每个维护级别组合"调整"我的SQLAlchemmy.

例如,在原始SQLite中.

SELECT*WHERE(设备IN [])和m_level1 = DATE AND m_level2 = DATE ....)

因此,每个if条件都可以有许多组合,它取决于检查哪个复选框.正如我所提到的,在原始SQL中我使用了很多字符串来达到我的目标.但我想使用SQLAlchemy改进代码.

对不起,我现在没有代码!谢谢你们 !

Bus*_*ust 18

我假设您正在使用ORM.

在这种情况下,该filter函数返回一个查询对象.您可以通过执行类似的操作来条件地构建查询

query = Session.query(schema.Object).filter_by(attribute=value)
if condition:
    query = query.filter_by(condition_attr=condition_val)
if another_condition:
    query = query.filter_by(another=another_val)

#then finally execute it

results = query.all()
Run Code Online (Sandbox Code Playgroud)


小智 8

该函数filter(*criterion)意味着您可以使用元组作为参数,@ Wolph在此处有详细信息: SQLALchemy dynamic filter_by for detail


aih*_*iho 5

如果我们谈到 SQLAlchemy 核心,还有另一种方式:

from sqlalchemy import and_


filters = [table.c.col1 == filter1, table.c.col2 > filter2]
query = table.select().where(and_(*filters))
Run Code Online (Sandbox Code Playgroud)

如果您尝试根据传入表单条件进行过滤:

form = request.form.to_dict()
filters = []
for col in form:
    sqlalchemybinaryexpression = (getattr(MODEL, col) == form[col])
    filters.append(sqlalchemybinaryexpression)
query = table.select().where(and_(*filters))
Run Code Online (Sandbox Code Playgroud)

其中 MODEL 是您的 SQLAlchemy 模型