Динамическое форматирование столбцов в SQL - и бэкэнд для хранения форматирования - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь создать систему на Python, в которой можно выбрать количество строк из набора таблиц, которые должны быть отформатированы определенным пользователем способом. Допустим, таблица a имеет набор столбцов, некоторые из которых содержат значение date или timestamp. Пользовательский формат для каждого столбца должен храниться в другой таблице, запрашиваться и применяться к основному запросу во время выполнения.

Позвольте привести пример: существуют разные способы форматирования столбца даты, например, используя

SELECT to_char(column, 'YYYY-MM-DD') FROM table;

в PostgreSQL.

Например, я бы хотел, чтобы второй параметр встроенной функции to_char() динамически запрашивался из другой таблицы во время выполнения, а затем применялся, если он имеет значение.

Чтение определения из таблицы как таковой не является большой проблемой, вместо создания схемы базы данных, которая будет получать данные из пользовательского интерфейса, из которого пользователь может выбирать, какие инструкции форматирования применять к различным столбцам. Пользователь должен иметь возможность выбирать набор столбцов пользователя для включения в запрос пользователя, а также пользовательское форматирование для каждого столбца.

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2009

Вытащите даты как метки времени Unix и отформатируйте их в Python:

SELECT DATE_PART('epoch', TIMESTAMP(my_col)) FROM my_table;

my_date = datetime.datetime.fromtimestamp(row[0]) # Or equivalent for your toolkit

Я обнаружил несколько преимуществ этого подхода: временные метки Unix являются наиболее экономичным общим форматом (этот подход практически не зависит от языка), а язык, на котором вы запрашиваете базу данных, богаче, чем базовая база данных. , предоставляя вам множество опций, если вы захотите сделать более удобное форматирование, например «сегодня», «вчера», «на прошлой неделе», «23 июня».

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

0 голосов
/ 01 октября 2009

Мне кажется, хранимая процедура или суб-выборка будет хорошо работать здесь, хотя я ее не проверял. Допустим, вы сохраняете date_format для каждого пользователя в таблице users.

SELECT to_char((SELECT date_format FROM users WHERE users.id=123), column) FROM table;

Ваш пробег может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...