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)
您可以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)
| 归档时间: |
|
| 查看次数: |
2521 次 |
| 最近记录: |