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))
from sqlalchemy import or_, and_
my_filters = set() ## <-- use a set to contain only unique values, avoid duplicates
if condition_1:
my_filters.add(MySQLClass.id == some_id)
if condition_2:
my_filters.add(MySQLClass.name == some_name)
fetched = db_session.execute(select(MySQLClass).where(or_(*my_filters))).scalars().all()
5条答案
按热度按时间kr98yfug1#
我假设您正在使用ORM。
在这种情况下,
filter
函数返回一个查询对象。您可以通过执行如下操作来有条件地构建查询ykejflvf2#
函数
filter(*criterion)
表示您可以使用元组作为其参数,@Wolph有详细信息:SQLALchemy dynamic filter_by表示详细信息tp5buhyn3#
如果我们谈到SQLAlChemy核心,还有另一种方法:
如果您尝试根据传入表单条件进行筛选:
其中MODEL是您的SQLAlChemy模型
pkbketx94#
这个问题的另一个解决方案是以一种更安全的方式提出这种情况,因为它验证要过滤的字段是否存在于模型中。
若要向要筛选的值添加运算符,请执行以下操作。并且不必向查询添加新参数,我们可以在值之前添加运算符,例如,
?foo=>1
,‘?foo=<1,
?foo=>=1,
?foo=<=1’,?foo=!1
,?foo=1
,最后它们之间将类似于`?foo=a,b‘。jrcvhitl5#
这是一个既适用于AND也适用于OR的解决方案。
如果需要,只需将代码中的
or_
替换为and_
: