Запрос пустой строки или Null с использованием SQLAlchemy - PullRequest
0 голосов
/ 03 мая 2018

Я довольно плохо знаком с дизайном баз данных и веб-дизайном, поэтому, пожалуйста, потерпите меня.

У меня есть приложение Flask, в котором мне нужно искать в базе данных в зависимости от аргументов, переданных в URL, с использованием flask-sqlalschemy, таких как:

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

Звездочка будет интерпретироваться как один или несколько символов и ** как один символ. Поэтому я заменю их на% и _ и уничтожу любые специальные символы.

Мой вопрос: в базе данных некоторые поля будут пустыми строками, а некоторые будут пустыми. Но мне нужно, чтобы они оба интерпретировались как пустая строка, так что они будут возвращены, когда аргумент пуст или *.

Я знаю, что могу сделать что-то вроде .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)

1 Ответ

0 голосов
/ 04 мая 2018

Функция COALESCE возвращает значение выражения первого аргумента, которое не оценивается как NULL (или NULL, если все значения оцениваются как NULL). Поэтому, если вы хотите обрабатывать NULL-номера деталей как пустые строки, вы можете сделать

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