使用SQLAlchemy查询空字符串或Null

时间:2018-05-03 20:19:48

标签: python postgresql flask sqlalchemy flask-sqlalchemy

我对数据库设计和网页设计都很陌生,所以请耐心等待。

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

.like(part_number == None | part_number == '%')

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

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

我知道我可以按照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) 的方式做点什么。但是我只想在搜索字符串是*的情况下这样做,但是当我有10个不同的args,all和' ed时,如何以聪明的方式做到这一点?

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

Call<List<YourModelHere>>

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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