Вопрос или проблема
Когда я нажимаю правой кнопкой мыши на выбранный SQL-запрос и выбираю «Format SQL», он изменяет SQL на строчные буквы.
Другая команда «To upper case» не является интеллектуальной для SQL, то есть она изменяет все в выделении на верхний регистр, поэтому она также не называется с «SQL» в названии.
Сам запрос не чувствителен к регистру и выполняется в SQL с глобальным изменением на верхний или нижний регистр, но внешняя функция Python, использующая результаты SQL-запроса, больше не может найти нужный столбец, когда он становится в верхнем регистре, так как она ищет column_name в нижнем регистре.
Это привело к следующей ошибке в моем интерфейсе:
AttributeError
AttributeError: у объекта 'Source' нет атрибута 'schedule_day'
Traceback (most recent call last)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/monitoring/app.py", line 149, in show_broken_sources
if source.schedule_day is None:
AttributeError: у объекта 'Source' нет атрибута 'item_day'
Отладчик поймал исключение в вашем WSGI-приложении. Теперь вы можете просмотреть трассировку, которая привела к ошибке.
Чтобы переключаться между интерактивной трассировкой и текстовой, вы можете щелкнуть на заголовок "Traceback". Из текстовой трассировки вы также можете создать пасту. Для выполнения кода наведите мышку на фрейм, который вы хотите отладить, и нажмите значок консоли справа.
Вы можете выполнить произвольный код Python в рамках стека, и доступны несколько дополнительных помощников для интроспекции:
dump() показывает все переменные в фрейме
dump(obj) показывает все, что известно об объекте
Предоставлено вам с помощью НЕ ПАНИКУЙТЕ, вашим дружелюбным интерпретатором трассировки на Werkzgue-платформе.
Есть ли способ изменить регистр на верхний только для SQL-командных слов, в идеале по умолчанию?
Перейдите в Файл —> Свойства —> Редакторы —> Редактор SQL —> Форматирование. Вы можете даже выбрать настройки источника данных, глобальные настройки или внешние настройки.
В моем случае в «Default Formatter» выберите «Upper», и вы можете использовать этот форматтер, используя Ctrl
+Shift
+F
.
Ответ или решение
Чтобы ответить на ваш вопрос и предложить решение проблемы с форматом SQL-запросов в DBeaver, важно сначала понять проблемное поведение и его причины. DBeaver — это мощный инструмент для управления базами данных, который поддерживает различные функции форматирования SQL, но в вашем случае стандартные опции форматирования могут не соответствовать вашим требованиям.
Теория
Ключевая проблема здесь в том, что функция "To Upper Case" в DBeaver не предназначена специально для SQL-кода. Она просто преобразует все выделенные слова в верхний регистр, что может нарушить обработку данных в других системах. Например, если ваши идентификаторы столбцов в SQL-запросе преобразуются в верхний регистр, это может привести к несоответствиям и ошибкам, особенно если ваш последующий код (например, на Python) ожидает их в нижнем регистре.
Рекомендации по хорошей практике программирования SQL предполагают, что системные зарезервированные слова (такие как SELECT, FROM, WHERE и т.д.) обычно записываются в верхнем регистре для улучшения читаемости, а имена таблиц, столбцов и другие пользовательские идентификаторы — в нижнем регистре. Это не только улучшает читаемость, но и снижает вероятность ошибок, связанных с регистрозависимостью.
Пример
Представьте, у вас есть следующий SQL-запрос:
select name, schedule_day from events where schedule_day is not null;
Если вы используете функцию "To Upper Case", результат будет следующим:
SELECT NAME, SCHEDULE_DAY FROM EVENTS WHERE SCHEDULE_DAY IS NOT NULL;
Однако, ваш Python-код:
if source.schedule_day is None:
ожидает, что имена полей (name
, schedule_day
) останутся в их оригинальном регистре, и не работает с верхним регистром.
Применение
Чтобы решить эту проблему и настроить форматирование так, чтобы только зарезервированные слова SQL становились в верхнем регистре, вам нужно улучшить и настроить встроенные возможности форматирования DBeaver. Вот пошаговое руководство по настройке:
-
Откройте настройки DBeaver:
- Зайдите в «File» → «Properties» → «Editors» → «SQL Editor» → «Formatting».
-
Настройка форматтера:
- Выберите «Default Formatter» из предложенных опций. Здесь вы можете задать правила форматирования по умолчанию.
-
Настройка структуры форматирования:
- Если у вас есть доступ к настройкам форматера, то во многих случаях можно кастомизировать правила форматирования через XML-файл или через графический интерфейс, если это поддерживается в текущей версии DBeaver. При этом нужно задать правила, которые учитывают только SQL-ключевые слова в верхнем регистре.
-
Применение настроек:
- После выбора и настройки формата, сохраните изменения и примените их к вашему текущему рабочему пространству.
- Теперь, чтобы отформатировать код, используйте сочетание клавиш
Ctrl
+Shift
+F
.
Если форматер по умолчанию не позволяет кастомизацию до нужного вам уровня, возможно, стоит рассмотреть использование скриптового подхода через инструментальные средства, написанные на Python или другом языке, где вы сможете более детально контролировать процесс преобразования регистра символов. Например, вы можете написать простой Python-скрипт, который будет принимать SQL-код, обрабатывать его в зависимости от регистра ключевых слов и пользовательских идентификаторов, и выводить уже форматированный текст.
Таким образом, следуя вышеизложенным шагам, вы сможете более точно настроить DBeaver под свои нужды, минимизировать влияние изменений регистра на последующую обработку данных и избежать ошибок в работе вашего приложения.