Я работаю программистом и мне часто приходится иметь дело с
базами данных. Основная часть моих обязанностей на текущей работе -это разработка схемы БД для Postgresql и создание функций на
языке pgSQL. Для разработки кода функций используется программа pgAdmin
3, поставляемая вместе с PostgreSQL. Программа бесплатна, но не всегда удобна. Особенно это
касается задач, связанных с созданием структуры СУБД. Для этих целей лучше всего подходит PostgreSQL Maestro, чей
дружелюбный интерфейс позволяет упростить и ускорить построение структуры базы.
Однако за долгое время работы с этими программами я заметил,
что pgAdmin гораздо стабильней работает, чем PostgreSQL Maestro. Последняя в случае недоступности сервера БД может просто завершиться с ошибкой, не давая возможности
сохранить набранный текст. Другой проблемой этой программы является отображение не в той кодировке
сообщений от сервера БД. Из-за этого часто невозможно узнать, в чем причина ошибки того или иного запроса. Поэтому для написания и
отладки функций я использую родную программу pgAdmin.
Однако и при написании кода возникает потребность узнать
точное наименование таблицы ее структуру. Раньше приходилось постоянно лазить дереву с таблицами и искать нужные названия
полей. Это замедляло написание коды. Однако недавно я открыл для себя
замечательную функцию этой программы - макросы.
Макрос - это команда SQL, которая может запускаться по нажатию определенного сочетания
клавиш в окне Query Tool.Макросы предназначены для выполнения каких-либо типовых операций.
Чтобы создать макрос, необходимо нажать на команду
"Макрос" в главном меню Query Tool.
В появившемся окне слева выбираем
сочетание клавиш, а справа вставляем текст макроса, который будет
соответствовать данному сочетанию клавиш.
Макросу нужно задать имя, а затем нажать кнопку "Сохранить".
Текст макроса
представляет собой обычный запрос, за исключением специального ключевого слова $SELECTION$. В это слово подставляется выделенный при
редактировании в Query Tool текст.
Получается, чтобы узнать какую-либо
информацию о таблице, вовсе не обязательно писать полный запрос к этой
таблице, достаточно написать ее имя, выделить данное имя и запустить макрос, запрашивающий
нужную информацию.
А теперь приведу примеры полезных макросов, которые я
использую в своей работе.
- Макрос, получающий список таблиц для схемы public базы данных PostgreSQL.
SELECT *
FROM information_schema.TABLES
WHERE
table_type='BASE TABLE' AND table_schema='public'
ORDER BY table_name
- Макрос, получающий список полей в таблице, чье название выделено (очень не хватало этой возможности, когда я перешел
с MS SQL Server 2008, в Microsoft Management Studio она была по-умолчанию).
SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS table_name,
quote_ident(attname) AS field_name,
format_type(atttypid,atttypmod) AS field_type,
case when attnotnull then ' NOT NULL' else '' end AS null_constraint,
case when atthasdef then 'DEFAULT ' ||
( SELECT pg_get_expr(adbin, attrelid)
FROM pg_attrdef
WHERE adrelid = attrelid AND adnum = attnum )::text else ''
end AS dafault_value,
case when nullif(confrelid, 0) IS NOT NULL
then confrelid::regclass::text || '( ' ||
array_to_string( ARRAY( SELECT quote_ident( fa.attname )
FROM pg_attribute AS fa
WHERE fa.attnum = ANY ( confkey )
AND fa.attrelid = confrelid
ORDER BY fa.attnum
), ','
) || ' )'
else '' end AS references_to
FROM pg_attribute
LEFT OUTER JOIN pg_constraint ON conrelid = attrelid
AND attnum = conkey[1]
AND array_upper( conkey, 1 ) = 1,
pg_class,
pg_namespace
WHERE pg_class.oid = attrelid
AND pg_namespace.oid = relnamespace
AND relname = btrim( '$SELECTION$' )
AND attnum > 0
AND NOT attisdropped
ORDER BY attrelid, attnum;
Таким образом, когда, в случае разработки, я забываю точное название таблицы, я выполняю команду для первого макроса. И у меня перед глазами появляется весь список таблиц схемы public. А когда мне хочется узнать список полей данной таблицы, то я просто выделяю ее название и запускаю второй макрос. Теперь разработка PgSql-функций для меня значительно ускорилась :)