一个简单的查询如下所示
User.query.filter(User.name == 'admin')
在我的代码中,我需要检查正在传递的参数,然后根据参数过滤数据库中的结果。
例如,如果 User 表包含像 username 这样的列、位置和电子邮件,请求参数可以包含其中之一,也可以包含列的组合。我不想像下面这样检查每个参数并链接过滤器,而是想创建一个动态查询字符串,该字符串可以传递到一个过滤器并可以取回结果。我想创建一个单独的函数,它将评估所有参数并生成一个查询字符串。生成查询字符串后,我可以传递该查询字符串对象并获得所需的结果。我想避免使用 RAW SQL 查询,因为它违背了使用 ORM 的目的。
if location:
User.query.filter(User.name == 'admin', User.location == location)
elif email:
User.query.filter(User.email == email)
你不必在 Flask 或 SQLAlchemy 中使用原始 SQL 来实现此目的。SQLAlchemy 的 ORM 提供了一种强大灵活的方式来动态构建查询。
下面是如何根据请求参数动态构建查询的方法:
from flask import request
from your_app import db # 导入你的 Flask SQLAlchemy 实例
def get_users(params):
"""
根据给定的参数查询用户。
Args:
params (dict): 包含查询参数的字典,例如 {'username': 'john', 'location': 'New York'}。
Returns:
list: 用户对象的列表。
"""
query = User.query
for param, value in params.items():
if hasattr(User, param):
column = getattr(User, param)
query = query.filter(column == value)
return query.all()
@app.route('/users')
def users_route():
params = request.args.to_dict()
users = get_users(params)
# ... 序列化并返回用户数据 ...
解释:
-
get_users(params)
函数: -
它接受一个
params
字典,该字典包含要根据其进行过滤的查询参数。 -
它以
User.query
开始,这是一个针对User
模型的基本查询对象。 -
它遍历给定的参数,并使用
hasattr
检查相应的列是否存在于User
模型中。 -
如果列存在,它使用
getattr
获取对列的引用,并使用传递的参数值将一个filter
子句添加到查询中。 -
最后,它返回执行的查询(
query.all()
),它将返回匹配用户对象的列表。 -
路由函数(例如
users_route
): -
它从请求对象(
request.args.to_dict()
)中检索查询参数。 -
它调用
get_users
函数以使用给定的参数获取过滤后的用户列表。 - 然后,它可以进一步处理用户对象,例如将它们序列化为 JSON 并将它们返回给客户端。
优点:
- 可读性和可维护性: 此方法保持代码干净且易于理解,因为它避免了复杂的条件语句。
- 灵活性: 它可以轻松处理任意数量的查询参数。
- 安全性: 它通过利用 SQLAlchemy 的 ORM 来防止 SQL 注入漏洞,因为 SQLAlchemy 会自动处理参数的安全转义。
使用这种模式,你可以创建一个单独的函数来根据任何给定的参数组合动态构建你的 SQLAlchemy 查询,从而使你的代码更具模块化和可维护性。
标签:python,mysql,flask-sqlalchemy From: 43926883