将 JSON 对象转换为可用的 sqlalchemy 过滤语句
Converting JSON object to usable sqlalchemy filter statements
我从烧瓶组件中请求调用:
request_json = request.get_json()
这是一个 JSON 对象,包含以下内容:
{'filter1' : '123', 'filter2' : '456', 'filter3' : '789' }
这些过滤器的大小也可能因前端用户而异。它可以只是一个或多个过滤器。
我想知道如何将这样的对象转换为可用的查询?我相信 or_()
和 and_()
是我需要用来构建过滤器的东西。是否可以做诸如...
query.filter_by(and_(*request_json))
我对整个技术堆栈都很陌生...任何帮助将不胜感激!
filter_by
采用关键字参数来执行基本的相等性过滤器。删除 and_
并将字典直接拼写成 filter_by
.
query.filter_by(**request_json)
但是,这不会对键或值进行验证。所以如果有人传入 'fish': 3
而没有 "fish" 列,或者传入 'column4': 'abc'
而 column4 实际上是一个数组类型,你会得到一个错误
因此,手动验证和过滤可能更安全、更直接。
query = MyModel.query
if 'column1' in data:
try:
value = int(data['column1'])
except (TypeError, ValueError):
pass
else:
query = query.filter(MyModel.column1 == value)
if 'column2' in data:
try:
value = datetime.utcfromtimestamp(int(data['column2']))
except (TypeError, ValueError):
pass
else:
query = query.filter(MyModel.column2 >= value)
# etc.
return query
我从烧瓶组件中请求调用:
request_json = request.get_json()
这是一个 JSON 对象,包含以下内容:
{'filter1' : '123', 'filter2' : '456', 'filter3' : '789' }
这些过滤器的大小也可能因前端用户而异。它可以只是一个或多个过滤器。
我想知道如何将这样的对象转换为可用的查询?我相信 or_()
和 and_()
是我需要用来构建过滤器的东西。是否可以做诸如...
query.filter_by(and_(*request_json))
我对整个技术堆栈都很陌生...任何帮助将不胜感激!
filter_by
采用关键字参数来执行基本的相等性过滤器。删除 and_
并将字典直接拼写成 filter_by
.
query.filter_by(**request_json)
但是,这不会对键或值进行验证。所以如果有人传入 'fish': 3
而没有 "fish" 列,或者传入 'column4': 'abc'
而 column4 实际上是一个数组类型,你会得到一个错误
因此,手动验证和过滤可能更安全、更直接。
query = MyModel.query
if 'column1' in data:
try:
value = int(data['column1'])
except (TypeError, ValueError):
pass
else:
query = query.filter(MyModel.column1 == value)
if 'column2' in data:
try:
value = datetime.utcfromtimestamp(int(data['column2']))
except (TypeError, ValueError):
pass
else:
query = query.filter(MyModel.column2 >= value)
# etc.
return query