是否有使用Sqlalchemy的Flask动态查询生成器?

Shw*_*ran 1 python mysql flask-sqlalchemy

一个简单的查询看起来像这样

User.query.filter(User.name == 'admin')
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我需要检查正在传递的参数,然后根据该参数从数据库中过滤结果。

例如,如果User表包含诸如用户名,位置和电子邮件之类的列,则request参数可以包含其中之一,也可以具有列的组合。我不想创建如下所示的每个参数并链接过滤器,而是创建一个动态查询字符串,该查询字符串可以传递给一个过滤器并返回结果。我想创建一个单独的函数,该函数将评估所有参数并生成查询字符串。一旦生成查询字符串,我就可以传递该查询字符串对象并获得所需的结果。我想避免使用RAW SQL查询,因为它违反了使用ORM的目的。

if location:
    User.query.filter(User.name == 'admin', User.location == location)
elif email:
    User.query.filter(User.email == email)
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 6

您可以filter重复地应用于查询:

query = User.query

if location:
    query = query.filter(User.location == location)

if email:
    query = query.filter(User.email == email)
Run Code Online (Sandbox Code Playgroud)

如果您只需要完全匹配,还可以filter_by

criteria = {}

# If you already have a dict, there are easier ways to get a subset of its keys
if location: criteria['location'] = location
if email: criteria['email'] = email

query = User.query.filter_by(**criteria)
Run Code Online (Sandbox Code Playgroud)

如果您由于某些原因不喜欢这些,我能提供的最好的方法是:

from sqlalchemy.sql.expression import and_


def get_query(table, lookups, form_data):
    conditions = [
        getattr(table, field_name) == form_data[field_name]
        for field_name in lookups if form_data[field_name]
    ]

    return table.query.filter(and_(*conditions))


get_query(User, ['location', 'email', ...], form_data)
Run Code Online (Sandbox Code Playgroud)