Я работаю программистом и мне часто приходится иметь дело с
базами данных. Основная часть моих обязанностей на текущей работе -это разработка схемы БД для 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.TABLESWHERE 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-функций для меня значительно ускорилась :)
Комментариев нет :
Отправить комментарий