python - 使用 SQLAlchemy 查询空字符串或 Null

标签 python postgresql flask sqlalchemy flask-sqlalchemy

我是数据库设计和网页设计的新手,所以请多多包涵。

我有一个 Flask 应用程序,我需要使用 flask-sqlalschemy 根据 url 中传递的参数在数据库中搜索,例如:

.../index?part_number=123*321$description1=&description2=TestText

星号将被解释为一个或多个字符,而 ** 将被解释为单个字符。所以我将用 % 和 _ 替换它们,并终止任何特殊字符。

我的问题是:在数据库中,有些字段会是空字符串,有些会是 Null。但我需要将它们都解释为空字符串,以便在 arg 为空或 * 时返回它们。

我知道我可以按照 .like(part_number == None | part_number == '%') 的方式做一些事情。但我只想在搜索字符串为 * 的情况下执行此操作,但是当我有 10 个不同的参数时,我该如何巧妙地执行此操作?

这是相关代码的片段和简化版本。我不太确定如何制作一个可以自行运行的小程序进行测试。

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 function返回不计算为 NULL(或 NULL,如果所有值都计算为 NULL)的第一个参数表达式的值。因此,如果您想将 NULL 部件号视为空字符串,您可以这样做

func.coalesce(Part.part_number, '').ilike(filters['part_number'])

关于python - 使用 SQLAlchemy 查询空字符串或 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163249/

相关文章:

python - 在数组中存储按钮和其他 wx 小部件

sql - 如何获取每个月的第一行数据(postgres)

javascript - 没有收到任何错误,但页面未在我的 Flask 应用程序中使用 render_template 进行渲染

sql - 如何从 postgresql sql 表中删除重复行

postgresql - 使用 ORM 将任意数据检索到嵌套对象中

python - 如何使用 WSGI 实现 Flask 应用按路径调度?

python - Flask - 图像问题 - 不能 str 和 numpy.ndarray

python - 从另一个 GroupBy 对象创建一个 GroupBy 对象

python - 错误 : too few arguments, 必须提供命令行包规范或 --file

python - 使用 SQLAlchemy Integer 字段创建用于过滤的 timedelta 对象