python - 使用 SQLAlchemy 查询空字符串或 Null
问题描述
我对数据库设计和网页设计很陌生,所以请多多包涵。
我有一个 Flask 应用程序,我需要根据 url 中传递的参数在数据库中搜索,使用 flask-sqlalschemy,例如:
.../index?part_number=123*321$description1=&description2=TestText
星号将被解释为一个或多个字符,** 被解释为单个字符。所以我将用 % 和 _ 替换它们,并终止任何特殊字符。
我的问题是:在数据库中,有些字段是空字符串,有些字段是 Null。但我需要将它们都解释为空字符串,这样当 arg 为空或 *.
我知道我可以做一些类似的事情.like(part_number == None | part_number == '%')
。但是我只想在搜索字符串为 * 的情况下这样做,但是当我有 10 个不同的 args 时,我该如何巧妙地做到这一点?
这是相关代码的片段和精简版本。我不太确定如何制作一个可以自行运行以进行测试的小程序。
filter_args = ['part_number', 'description1', 'description2'] # actual code has ~10 args
filters = dict()
for arg in filter_args:
filter_str = request.args.get(arg, type=str, default='*') # get filter arg from url
filter_str = '*' if filter_str == '' else filter_str # if the filter string is empty, search for all
# Replace * by % and ** by _ and terminate special chars
filter_str = filter_str.replace('\\', '\\\\')
filter_str = filter_str.replace('%', '\%')
filter_str = filter_str.replace('_', '\_')
filter_str = filter_str.replace('**', '_')
filter_str = filter_str.replace('*', '%')
filters[filter_name] = filter_str
parts = Part.query.filter(
Part.part_number.ilike(filters['part_number']), # and
Part.description1.ilike(filters['description1']), # and
Part.description2.ilike(filters['description2'])
).order_by(Part.part_number)
解决方案
COALESCE 函数返回不计算为 NULL 的第一个参数表达式的值(或 NULL,如果所有值都计算为 NULL)。因此,如果您想将 NULL 零件号视为空字符串,您可以这样做
func.coalesce(Part.part_number, '').ilike(filters['part_number'])
推荐阅读
- c# - 如何根据 JSON 中的值将值绑定到 JSON 文件?
- java - Split ArrayList
using particular value - java - Prepared statement inserting String " " into database instead of null
- eclipse - Eclipse 文件缺少文件夹,并且在源代码中缺少
- ios - 在 swift 错误 TIC 读取状态下解析 Api
- spring - Avoid duplicate code in criteria builder query in spring data jpa
- swift3 - 当我在 Tableview 中加载我的 json 时,我发现无法转换类型值的错误
- vue.js - vuejs点击测试鼠标事件
- c# - DataGridViewButtonCell 需要两次点击才能触发事件
- xamarin - Prism Navigation 在导航到其他页面后保留 MasterPageDetail 菜单