【问题标题】:Query for empty string or Null using SQLAlchemy使用 SQLAlchemy 查询空字符串或 Null
【发布时间】:2018-05-03 20:19:48
【问题描述】:

我对数据库设计和网页设计还很陌生,所以请多多包涵。

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

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

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

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

我知道我可以按照.like(part_number == None | part_number == '%') 的方式做一些事情。但是我只想在搜索字符串为 * 的情况下这样做,但是当我有 10 个不同的 args 时,我该如何巧妙地做到这一点?全部加在一起?

这是相关代码的 sn-p 和精简版本。我不太清楚如何制作一个可以自行运行以进行测试的小程序。

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(<expr>, '') 将可空字符串解释为空字符串。
  • 是的,我不确定需要多少信息。您将如何将其嵌入到查询中?我似乎在快速 google 会话中找不到太多信息。
  • 成功了!非常感谢您的帮助。

标签: python postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当我遇到这个问题时,我正在寻找一种过滤空字符串或空字符串的方法。虽然 Ilja 的回答对于 OP 问题的具体情况是正确的,但我想我会补充一点,合并功能也适用于我的情况。如果 OP 正在查找 part_number 为 None 或为空的行:

    Pat.query.filter(func.coalesce(Part.part_number, '') == '')
    

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多