Используя Django SQL Explorer, как правильно установить даты по умолчанию для параметров с бэкэндом PostgreSQL? - PullRequest
1 голос
/ 08 ноября 2019

Наше приложение Django только что перешло с MySQL на PostgreSQL, и мы находимся в процессе обновления наших пользовательских запросов, чтобы использовать правильный синтаксис. Эти запросы сохраняются / выполняются с помощью Django-SQL-Explorer.

У меня есть запрос, который для простоты выглядит так:

SELECT * FROM table t WHERE t.scheduled_start_date BETWEEN $$from_date$$ AND $$to_date$$

Вышеприведенный запрос работает, но я хотел бы установить значения по умолчанию на сегодня и сегодня + 30 соответственно.

Я пробовал следующие предложения WHERE безрезультатно:

Работает с введенным пользователемдата, по умолчанию генерирует синтаксическую ошибку

WHERE t.scheduled_start_date BETWEEN date('$$from_date:CURRENT_DATE$$') AND date('$$to_date:CURRENT_DATE + INTERVAL \'30 DAY\'$$')

Ошибка с использованием значений по умолчанию :syntax error at or near "30" LINE 28: ...urrent_date') AND date('current_date + interval \'30 day\'') ^

Настройки по умолчанию работают правильно, но введенные пользователем даты не:

WHERE t.scheduled_start_date BETWEEN date($$from_date:CURRENT_DATE$$) AND date($$to_date:CURRENT_DATE + INTERVAL '30 DAY'$$)

Ошибка с датами пользователя :function date(integer) does not exist LINE 28: WHERE t.scheduled_start_date BETWEEN date(2019-09-30) AND da... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Сообщение о приведении имеет смысл для меня, так как пользователь вводит строковые данные, однако мне кажется, что синтаксис, правильный при преобразовании в DATE, не может быть правильным, но только при переопределении значения по умолчанию.

Любые предложения будут полезны. Спасибо!

1 Ответ

0 голосов
/ 09 ноября 2019

Ваш ввод - строковое значение, current_date - вызов функции. Первый нуждается в кавычках, а второй нет. Поэтому ваша замена на стороне клиента не будет работать. Вы можете переместить логику по умолчанию в оператор SQL, используя функцию COALESCE() doc .

В случае, если клиент отправляет пустые значения для пустого пользовательского ввода, это приведет к следующему выражению where:

BETWEEN date(COALESCE('$$from_date$$',current_date)) 
    AND date(COALESCE('$$from_date$$',current_date + interval '30 DAYS'))

Вы добавили, что ваш клиент отправляет пустую строку, а не NULL стоимость. Так что это должно быть изменено на:

BETWEEN COALESCE(NULLIF('$$from_date$$','')::date, current_date)
    AND COALESCE(NULLIF('$$from_date$$','')::date, current_date + interval '30 DAYS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...