Самоучитель по SQL-сервер в Linux

         

Клиенты PostgreSQL

В этой главе приводится дополнительная информация о клиентах PostgreSQL — приложениях, обеспечивающих пользовательский интерфейс с сервером Post-greSQL.

В настоящее время наибольшее распространение получили две программы: клиент командной строки psql и его графический аналог PgAccess. Клиент psql устанавливается по умолчанию, а для установки PgAccess следует задать ключ - -with-tcl во время компиляции исходных текстов PostgreSQL (как упоминалось в главе 2).



Дополнительные возможности клиента psql

Основные сведения о клиенте psql приводились в главе 4. В этом разделе рассматриваются его нетривиальные возможности. В частности, здесь приводится полный список ключей командной строки и описания всех команд psql. Кроме того, в этом разделе рассматриваются и такие темы, как загрузка входных данных SQL из внешних файлов, работа с журналом из командной строки и динамическая подстановка переменных в команды SQL.

Параметры командной строки

Полная команда запуска psql имеет следующий синтаксис:

psql[ ключи ] [ бдЗд_дднных [ пользователь ] ]

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

В командной строке также могут задаваться дополнительные ключи. По умолчанию psql поддерживает как стандартные короткие ключи в стиле Unix (например, -с), так и длинные ключи в стиле GNU (например, --command). В некоторых системах второй вариант недоступен. В следующем перечне приведены короткие ключи Unix, всегда состоящие из одной буквы, за которыми указывается эквивалентный длинный ключ.

-а, -echo- al I. Включение режима полного вывода эха для всех строк, полученных psql. Ключ обычно используется при написании сценариев и эквивалентен команде \set ECHO all клиента psql. -A, -no-al ign. Клиент psql выводит результаты без выравнивания. Если ключ не задан, по умолчанию выбирается режим вывода с выравниванием. -с команда, --command команда. Вместо запуска в интерактивном режиме psql выполняет всего одну команду. Команда должна иметь правильный синтаксис SQL, причем в ней не могут использоваться специфические команды psql. -d база_данных, --dbname база_данных. База данных, к которой производится исходное подключение. -е, - -echo-queries. Включение режима вывода эха для запросов. -Е, - -echo-hidden. Включение режима вывода скрытых запросов, сгенерированных командами psql. Аналогичного эффекта можно добиться командой \set ECHOJHIDDEN клиента psql. - f файл, - - f i 1 е файл. Вместо запуска в интерактивном режиме psql читает код SQL из файла с заданным именем и выполняет его так, как если бы он был введен непосредственно в командной строке. После обработки файла psql завершает работу. -F разделитель, -field-separator разделитель. Заданный символ используется psql в качестве разделителя нолей. - h хост, - - host хост. Имя компьютера, на котором работает сервер PostgreSQL. Обычно не является обязательным при подключении к локальному серверному процессу с использованием доменных сокетов Unix. Тем не менее если процесс postmaster работает с файлом доменного сокета в каталоге, отличном от принятого по умолчанию каталога /tmp, то параметр хост с начальным символом / интерпретируется как локальный каталог, содержащий файл доменного сокета (например, при передаче параметра -h /var/pgsql клиент psql ищет файл доменного сокета в каталоге /var/pgsql). -H, -html. Запуск psql в режиме вывода в формате HTML. -1, - -11 st. Вывод списка баз данных, к которым может подключиться клиент. -о файл, -output файл. Выходные данные psql направляются в заданный файл. -р порт, -port порт. Порт TCP/IP (или числовой доменный сокет Unix), на котором в данный момент ведется прослушивание. Совпадает со значением переменной PGPORT (по умолчанию — 5432). -Р имя=значение, - -pset имя=зпачение. Параметры форматирования выходных данных в синтаксисе команды \pset. Имена совпадают с именами параметров \pset, но значение параметра отделяется от имени не пробелом, а знаком равенства (=). -q, - -quiet. Режим минимального вывода, в котором не выводятся ни информационные сообщения psql, ни пояснительный текст. -R разделитель, -record-separator разделитель. Заданный символ используется psql в качестве разделителя записей. -s, - -single-step. Пошаговый режим работы. После выполнения команды SQL пользователю предлагается продолжить или завершить работу. -S, - -single-1 ine. Строчный режим работы. В этом режиме символ новой строки интерпретируется как символ точки с запятой (;), завершающий команду SQL. -1, - - tupl es - on! у. Подавление вывода дополнительных данных (например, имен полей и итоговых данных). В psql эта задача решается командой \t. -Т атрибут, -table-attr атрибут. Атрибут HTML, включаемый в тег <tab1e> в режиме вывода HTML (например, width=100X). Чтобы передать в этом параметре несколько табличных атрибутов, заключите их в кавычки. В psql атрибуты также могут задаваться командой \pset. -U пользователь, -username пользователь. Подключение к базе данных с заданным именем пользователя. -v имя=значение, --variable имя=значение. Присваивание значения переменной с заданным именем (по аналогии с командой \set в psql). Значение отделяется от имени не пробелом, а знаком равенства (=). -V, - -version. Вывод информации о версии. -W. -password. Запрос пароля перед подключением к базе данных. Введенный пароль продолжает действовать в течение всего сеанса psql. -х, -expanded. Расширенный режим форматирования записей. Активизируется в psql командой \х. -X, - -no-psqlrc. Запрет чтения и выполнения стартового файла (~/.psqlrc). -?, - -help. Вывод краткой справки по аргументам командной строки psql.

ВНИМАНИЕ

В версии 7.0 код, запрашивающий пароль у пользователя, если серверный процесс требует аутентификации при подключении к базе, работает нестабильно, что иногда приводит к ошибке и отказу в подключении. Если вы знаете, что подключение должно сопровождаться аутентификацией, задайте ключ принудительного запроса пароля -W (--password).

Управляющие команды psql

Как упоминалось в главе 2, в psql существуют особые команды, начинающиеся с символа \. Эти команды управляют работой psql и не передаются серверу PostgreSQL. Ниже приведены описания управляющих команд psql.

Команды форматирования

Команды \pset, \а, \С, \f, \H, \t, \T и \х управляют форматированием выходных данных. Каждая команда (за исключением \pset) управляет отдельным аспектом форматирования. Команда \pset, появившаяся позже других, позволяет управлять практически всеми параметрами. Остальные команды существуют для совместимости со старыми версиями и для удобства, но большинство из них дублирует возможности \pset.

\pset параметр [значение]. Основная команда настройки параметров форматирования, самая важная и самая мощная из всех команд psql, управляющая большим количеством параметров. Возможно, другие команды вам вообще не понадобятся. Ниже перечислены значения параметра команды \pset. format. Устанавливает формат вывода aligned, unaligned, html или latex. По умолчанию используется вывод с выравниванием (aligned), самый наглядный из всех вариантов. При сплошном выводе (unal igned) все данные выводятся в одной строке и разделяются текущим символом-разделителем. В режимах html и latex данные выводятся в виде таблиц, предназначенных для включения в документы HTML и LaTeX соответственно. border. Изменяет толщину рамки таблиц в зависимости от выбранного формата вывода. Например, при выводе в режиме HTML значение этого параметра отражается в атрибуте border тега <table>. Параметр принимает числовое значение. Как правило, с увеличением числа растет толщина выводимой рамки. expanded. Переключение между обычным и расширенным форматами вывода. Если у вас возникают проблемы с выводом данных на экран (например, если строки переносятся недопустимым образом), попробуйте изменить этот параметр. В расширенном формате psql выводит все данные в два столбца. В левом столбце приводится имя поля, а в правом — его значение. null. Параметр задает строку, выводимую вместо псевдозначения NULL. Обычно вместо NULL выводится пустая строка, которая определяется при помощи двух апострофов (' '). Любая другая строка заключается в апострофы. Пример:

\pset null ' ***null*** '

fieldsep. Параметр задает символ, используемый для"разделения полей в режиме сплошного вывода (unaligned). По умолчанию используется вертикальная черта (|). При желании можно воспользоваться другим, более привычным разделителем — например, символом табуляции (U) или запятой (.). В других режимах форматирования разделитель полей игнорируется. recordsep. Разделитель записей в режиме сплошного вывода. По умолчанию используется символ новой строки (\п). tuples_only. Параметр указывает, ограничивается ли вывод одними данными (то есть результатами запроса) или же в него включаются дополнительные сведения о таблице (заголовки и комментарии). title. Параметр задает заголовок — строку, предшествующую всему стандартному выводу. Пустая строка задается двумя апострофами (' '). tab! eattr. Используется в режиме форматирования HTML для определения атрибутов тега <table> (например, width, cell padding и cell spacing). Если потребуется определить сразу несколько атрибутов, не забудьте заключить строку атрибутов в апострофы. pager. Параметр разрешает или запрещает использование программы постраничного вывода содержимого таблиц. Если вы хотите использовать вместо тоге другую программу постраничного вывода (например, less), перед запуском psql задайте значение переменной среды PAGER в командном интерпретаторе. \а. Переключение между режимом вывода с выравниванием и сплошным выводом. Эквивалент последовательного выполнения команд \pset format al igned и \pset format unaligned. \С. Заголовок запроса, выводимый перед данными итогового набора. Эквивалент команды \pset title. \f. Разделитель полей, используемый в режиме сплошного вывода. Эквивалент команды \pset fieldsep. \Н. Переключение между выводом в формате HTML и стандартным режимом вывода с выравниванием. Эквивалент последовательного выполнения команд \pset format HTML и \pset format aligned. \t. Признак вывода дополнительной информации таблиц. Эквивалент команды \pset tuples_only. \Т. Дополнительные атрибуты таблиц, вставляемые в теги <tab!e> в режиме форматирования HTML. Эквивалент команды \pset tableattr. \х. Переключение режима расширенного вывода. Эквивалент команды \pset expanded.

Команды вывода информации

Клиент psql поддерживает несколько команд, предназначенных для получения информации о базе данных и различных объектах внутри нее. Большинство команд снабжается префиксом \d (от слова «display»). Умение пользоваться этими командами повышает эффективность работы с базой данных.

\d [ имя_отношения ]. Общая команда для получения различных сведений о заданном отношении — индексе, последовательности, таблице или представлении. Команда выводит имена и типы всех полей отношения, а также специальные атрибуты или значения по умолчанию. Если имя отношения не указано, команда выводит информацию обо всех отношениях текущей базы данных. \da [ агрегатная_фупкция ]. Команда выводит список агрегатных функций текущей базы данных и поддерживаемые ими типы данных. Если команда вызывается с параметром, она выводит список только тех агрегатных функций, имена которых начинаются с заданного шаблона (без учета регистра символов). \dd [ имя ]. Общая команда для получения информации об объектах базы данных. Параметр может быть именем любой агрегатной или обычной функции, оператора, отношения, правила или триггера. Если имя не задано, выводится информация обо всех объектах базы данных. \df [ имя_фунщии ]. Команда выводит информацию о функции, определенной в базе данных, в том числе о типах ее аргументов и возвращаемом значении. Если имя функции не задано, выводится информация обо всех функциях в базе. Как и в случае с командами \da и \dd, при вводе полного или частичного имени функции команда выводит список всех функций, имена которых начинаются с заданного шаблона (без учета регистра символов). \d[istvS] [ имя ]. Общая команда вывода информации об отношениях с возможностью уточнения. Символы в квадратных скобках имеют следующий смысл: i — индексы; s — последовательности; t — таблицы; v — представления; S — системные таблицы. \dl. Команда выводит информацию о больших объектах текущей базы данных; эквивалент команды \1o_list. \do [ имя_оператора ]. Команда выводит список всех операторов, определенных в текущей базе данных, с типами операндов и возвращаемого значения. Как и в других командах, можно задать полное или частичное имя оператора или получить информацию обо всех доступных операторах. \dp [ имя_объекта ]. Команда выводит список всех объектов текущей базы данных (или объектов, имена которых хотя бы частично совпадают с заданным) вместе с информацией о правах доступа (общих, пользовательских и групповых). \dT [ имя_типа ]. Команда выводит список всех доступных типов данных. Можно задать полное или частичное имя типа или получить информацию обо всех доступных типах. \1. Команда выводит список всех баз данных на сервере с информацией о владельцах и типе расширенной кодировке. Команда \1 + также выводит комментарии (процедура создания комментариев описана в подразделе «Документирование базы данных» раздела «Сопровождение базы данных» главы 9). \lo_list. Команда выводит список всех больших объектов текущей базы данных с комментариями. \z [ имя_объекта ]. Команда выводит информацию о правах доступа; эквивалент команды \dp.

Вывод информации о PostgreSQL и psql

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

\?. Команда выводит список управляющих команд, описанных в данной главе. \copyright. Команда выводит информацию об авторских правах на PostgreSQL. \encoding. Если включена поддержка расширенных кодировок, команда позволяет задать кодировку для клиента. Если аргумент не задан, на экране выводится текущая кодировка. \help. Общая команда получения справочной информации. При вызове без аргумента выводится список всех команд, для которых имеется подробная справка. С аргументом выводится дополнительная информация по заданной теме. Если в качестве аргумента указан символ *, команда возвращает справку по синтаксису всех документированных команд SQL.

Команды ввода-вывода

Команды ввода-вывода psql предназначены для импортирования и экспортирования данных, а также для настройки параметров пересылки данных.

\copy таблица { FROM | ТО }файл \ stdin | stdout. Команда позволяет скопировать данные, полученные от клиентского приложения (с правами пользователя, запустившего клиента), вместо копирования данных с сервера командой SQL COPY. Поддерживаются все стандартные элементы команды COPY. За дополнительной информацией о синтаксисе обращайтесь к описанию команды COPY (см. главу 14). Следует помнить о принципиальных различиях между командами \copy и COPY: Данные, скопированные командой \copy, сначала передаются через клиентское приложение. При этом скорость копирования оказывается несколько ниже, чем при непосредственном копировании из серверного процесса. Доступ к файлам локальной файловой системы предоставляется с правами учетной записи текущего пользователя. Таким образом, клиент может иметь расширенный (или наоборот, ограниченный) доступ к файлам по сравнению с серверным процессом. Обозначения stdin и stdout (стандартный ввод и вывод) интерпретируются по-разному: в psql они относятся ко входному и выходному потокам. В контексте серверного процесса stdin представляет источник данных команды COPY, a stdout представляет выходной поток запроса. \echo строка. Заданная строка передается в стандартный вывод. Команда часто используется при написании сценариев, поскольку с ее помощью можно включить в вывод сценария данные, не предоставляемые СУБД (например, комментарии). \д [ файл ]. Команда выполнения буфера. Как и символ точки с запятой (:) в конце команды SQL, передает текущее содержимое буфера запроса серверу для обработки. Аргумент позволяет сохранить итоговый набор в заданном файле или передать его следующей программе для дальнейшей обработки. \i файл. Чтение входных данных из файла с заданным именем. Содержимое файла интерпретируется так, словно оно было введено непосредственно в приглашении psql. \1o_export old файл. Экспортирование больших объектов с заданным идентификатором объекта (OID) в локальную файловую систему. Отличается от функции сервера 1o_export() так же, как команда \copy в psql отличается от команды COPY в SQL. \lo_import файл [ комментарий ]. Импортирование больших объектов из локальной файловой системы в базу данных. К объекту можно присоединить необязательный комментарий; это рекомендуется делать, поскольку в противном случае на него можно будет ссылаться только по значению OID, которое придется запоминать для дальнейшего использования. Если присоединить к объекту комментарий, то команда \lo_list выведет комментарий вместе со значением OID объекта, что упростит его поиск после импортирования. \о [ файл \ /команда ]. Перенаправление вывода (например, результатов выборки) в файл или его передача системной команде для дальнейшей обработки. Если аргумент не задан, перенаправление прекращается и происходит восстановление стандартного вывода. Особого внимания заслуживает возможность конвейерной (pipe) передачи вывода системным командам (например, дгер), что позволяет проводить поиск по шаблонам в выходных данных запросов и управляющих команд psql. \р. Вывод текущего содержимого буфера psql. Если с момента выполнения последней команды новые данные не поступали, отображается последняя выполненная команда. \qecho строка. Заданная строка направляется в канал вывода, заданный командой \о (вместо stdout). Команда обычно используется для включения дополнительной информации в выходной поток psql. \w файл \ /команда. Текущий буфер запроса направляется в заданный файл или передается системной команде для дальнейшей обработки.

Системные команды

Следующая группа команд относится к общесистемным функциям psql — подключению к другой базе данных, вызову внешнего редактора, присваиванию значений переменным psql и завершению работы с клиентом.

\connect [ база_данных [ пользователь ] ]. Подключение к другой базе данных. Аргументы команды определяют базу данных и имя пользователя, под которым производится подключение (если оно отлично от текущего имени пользователя). Если последний аргумент не задан, используется текущее имя пользователя. \edit [ файл ]. Запуск внешнего редактора, в котором загружается либо заданный файл, либо (при отсутствии аргумента) текущее содержимое буфера запроса. После завершения редактирования новое содержимое пересылается в буфер запроса или, если оно завершено символом точки с запятой (:), немедленно выполняется. При редактировании файла psql определяет, какой редактор следует запустить, просмотром следующих переменных среды (в указанном порядке): PSQL_EDITOR, EDITOR и VISUAL. Если ни одна из этих переменных не определена, psql пытается запустить команду /bin/vi. \q. Завершение работы с программой. В большинстве терминальных приложений для выхода также используется комбинация клавиш Ctrl+D. \set [ переменная [ значение ] ]. Присваивание значений переменным среды. При вызове без аргументов команда выводит список всех текущих значений переменных среды, а при вызове с аргументами заданной переменной присваивается новое значение. При передаче нескольких значений переменной присваивается результат их конкатенации. \unset переменная. Сброс, то есть удаление из памяти, переменных среды. Результат отличается от присваивания пустой строки, поскольку в этом случае переменная продолжает существовать в памяти. \! [ команда ]. Выполнение внешних команд. При вызове без аргументов запускается сеанс командного интерпретатора, который временно замещает приглашение psql (до завершения сеанса). При вызове с аргументами заданная команда выполняется в psql, а результаты выводятся в stdout.


Загрузка запросов из внешних файлов

Кроме непосредственного ввода запросов в приглашении, в psql предусмотрена возможность создания запросов и команд в файлах с последующей загрузкой их содержимого в текущий буфер. Данная возможность часто используется на практике.

Создайте файл с текстом запроса и запустите psql. Загрузка файлов в буфер запроса производится командой VI. В листинге 6.1 приведен пример загрузки простой команды SELECT из файла в буфер. В данном случае текст запроса отображается на экране, но в вашей системе по умолчанию этого может и не происходить. Чтобы содержимое загружаемого файла выводилось в psql, присвойте переменной ECHO значение all (команда \set ECHO all).

Листинг 6.1. Загрузка файла в текущий буфер

testdb=# \set ECHO all

testdb=| \i /usr/local/pgsql/query

SELECT * FROM employees WHERE firstname='Andrew';

firstname I lastname I Id

Andrew | Brookins | 100

(1 row)

Возможно, при частом выполнении этой операции удобнее воспользоваться командой \edit.

Библиотеки readline и history

Клиент psql обладает некоторыми возможностями режима командной строки, поддерживаемыми интерпретатором bash: автоматическим завершением команд, обратным поиском и историей команд (файл /home/пользователь/psql_history). Все эти возможности доступны благодаря поддержке библиотеки readline, обеспечивающей эти функции bash.

Если конфигурационный сценарий находит в системе библиотеку readline, то поддержка обратного поиска, завершения и истории команд устанавливается автоматически при компиляции PostgreSQL. Если после компиляции выяснится, что в psql эти возможности отсутствуют, это может объясняться тем, что библиотечные и/или заголовочные файлы находились в нестандартном каталоге. Если вы хотите изменить конфигурацию psql и включить поддержку расширенных средств командной строки, начните с поиска заголовочных файлов (libreadline.h, readline.h и history.h).

Определив местонахождение библиотечных и заголовочных файлов в системе, сообщите эти данных сценарию PostgreSQL configure при помощи следующих ключей:

- -with-includes=Kaталог_заголовочных_файлов

- -with-11Ь$=каталог_6иблиотечных_файлов

После изменения конфигурации постройте двоичный файл psql заново. Дополнительная информация о настройке конфигурации PostgreSQL приведена в подразделе «Этап 3. Настройка конфигурации» раздела «10 этапов установки PostgreSQL» главы 2.




Работа с переменными

Клиент psql также позволяет работать с переменными. Команда \set создает и модифицирует переменные, а команда \unset удаляет их. Переменные psql работают так же, как переменные среды в командных интерпретаторах Unix и Linux (например, bash). Хотя в целом переменные psql реализованы довольно просто, они приносят несомненную пользу, поскольку значения переменных легко подставляются в управляющие команды psql и в команды SQL.

ПРИМЕЧАНИЕ

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

Новое значение переменной задается командой \set, за которой указываются имя и значение, разделенные пробелами. Команда либо изменяет значение существующей переменной, либо создает новую переменную, если переменная с указанным именем не существует. Имя переменной имеет произвольную длину и содержит произвольную комбинацию букв, цифр и символов подчеркивания, а значение переменной может быть строкой любой длины. Пример приведен в листинге 6.2.

Листинг 6.2. Присваивание значения переменной

testdb=# \set myvariable 'There are many like it. but this one is mine.'

Если теперь ввести команду \set без аргументов, переменная появляется в общем списке.

Листинг 6.3. Список переменных

testdb-# \set

VERSION = 'PostgreSQL 7.1.3 on i586-pc-linux-gnu. compiled by GCC 2.96'

DBNAME = 'testdb1

USER = 'postgres'

PORT = '5432'

ENCODING = 'SQL_ASCII'

PROMPT1 = '%/№%# '

PROMPT2 = '*/та# '

PROMPTS = '» '

HISTSIZE = '500'

myvariable = 'There are many like it. but this one is mine.'

После определения переменной ее можно включать как во внутренние управляющие команды psql, так и в команды SQL. Подстановка значения переменной вместо ее имени называется интерполяцией. Механизм интерполяции открывает много полезных возможностей — например, можно загрузить файл в переменную, а затем использовать загруженное содержимое в команде INSERT или SELECT. Возможны и более простые подстановки.

Чтобы подставить значение переменной, укажите перед ее именем префикс :. В листинге 6.4 приведен пример интерполяции в командах INSERT и SELECT.

Листинг 6.4. Интерполяция в командах SQL

testdb=# \set manager_id 150

testdb=# INSERT INTO employees VALUES (

testdb(# 'Kevin', testdb(# 'Murphy',

testdb(# :manager_id

testdb(# ):

testdb=# SELECT * FROM employees WHERE id = :manager_id;

firstname I lastname I id

Kevin | Murphy | 150

(1 row)

Как упоминалось выше, в переменную можно загрузить содержимое файла, а затем интерполировать ее в другую команду. Для этого присвойте переменной результат выполнения команды cat (команда Unix, предназначенная для вывода содержимого файла), заключенный в обратные апострофы (' '). В листингах 6.5 и 6.6 в качестве примера используется файл tab! edata, находящийся в домашнем каталоге пользователя (~/).

Листинг 6.5. Чтение данных из файла в переменную

testdb=# \set data 'cat tabledata'

testdb=# \echo :data

'Mike'. 'Nelson'. 151

Листинг 6.6. Интерполяция переменной в команде INSERT

testdb=# INSERT INTO employees VALUES (-.data):

После листинга 6.6 в таблице empl oyees появляется новая запись со значениями полей, загруженными из переменной data.

Настройка приглашения psql

Клиент psql допускает полную настройку внешнего вида своего приглашения. Например, это позволяет выводить различную полезную информацию наиболее простым и наглядным способом (что может быть нагляднее приглашения, в котором вводятся данные?) В psql данные приглашения хранятся в переменных PROMPT1, PROMPT2 и PROMPTS. В разных ситуациях программа отображает разные варианты приглашения.

Переменная PROMPT1 содержит стандартное приглашение, используемое по умолчанию. Переменная PROMPT2 содержит приглашение, выводимое в новой строке незавершенной команды или запроса (то есть запрос не был завершен символом ; и для него не выполнялась команда \д). Приглашение, хранящееся в переменной PROMPTS, отображается при вводе данных во время выполнения команды SQL COPY. Чтобы узнать текущую настройку приглашений, введите команду \set без аргументов — на экране появляется список текущих переменных. Найдите в нем переменные PROMPT1, PROMPT2 и PROMPTS. Их значения, заключенные в апострофы, определяют внешний вид приглашений psql. Символы с префиксом % (например, %т) являются переменными; остальные символы выводятся в точности так, как показано.

В табл. 6.1 приведены значения по умолчанию для всех трех переменных. Обратите внимание, во второй строке (в примере для PROMPT2) предполагается, что в незавершенном запросе имеется открывающая круглая скобка, вследствие чего знаку # предшествует символ (.

Таблица 6.1. Настройка приглашений по умолчанию

Приглашение Переменная Пример

PROMPT1

'8/SW1

testcBHf

PROMPT2

%1%Ш '

testdb(f

PROMPTS

' » '

»

Изменение приглашений

Чтобы изменить приглашение psql, достаточно изменить значение соответствующей переменной командой \set. Символ % является префиксом стандартных переменных, перечисленных в табл. 6.2. Символ \п используется для перевода строки, остальные символы выводятся обычным образом. Команда в листинге 6.7 изменяет переменную PROMPT1 и включает в стандартное приглашение дополнительный префикс psql:.

Листинг 6.7. Настройка приглашений

testdb=# Nset PROMPT1 'psql:%/%R%#'

psql:testdb=#

Таблица 6.2. Стандартные переменные в приглашениях

Обозначение Описание

%~

Имя текущей базы данных. Если используется база данных по умолчанию, в приглашении выводится тильда (~)

и

Знак #, если текущий пользователь зарегистрирован в качестве суперпользователя базы данных. В противном случае выводится знак >

%>

Номер порта, на котором сервер базы данных принимает подключения

%/

Имя текущей базы данных

Имя сервера, на котором работает PostgreSQL, усеченное до первой точки (например, «yourserver.com» в приглашении превращается в «yourserver»)

IM

Полное имя сервера, на котором работает PostgreSQL. Если информация недоступна, в приглашении выводится строка «localhost»

%п

Текущее имя пользователя базы данных

%R

В приглашении PROMPT1 обычно выводится знак равенства (=); в строчном режиме выводится знак л; при разрыве связи с сервером выводится восклицательный знак (!). В приглашении PROMPT2 вместо знака равенства обычно выводится дефис (-), а в начале новой строки в незавершенной команде выводится соответствующий символ (например, если в многострочном запросе осталась открытая круглая скобка, то переменная Ж включит круглую скобку в приглашение). В приглашении PROMPT3 не выводится ничего

% ЧИСЛО

Символ, заданный в виде десятичного, восьмеричного или шестнадцатеричного кода. Восьмеричные коды имеют префикс 0; шестнадцатеричные коды имеют префикс Ох; остальные числа интерпретируются как десятичные

% : переменная

Значение переменной в psql задается с префиксом :

% 'команда

В приглашение вставляются выходные данные заданной команды

Примеры приглашений

Комбинируя разные переменные в команде \set, можно придать приглашению любую желаемую форму. Пример создания нового приглашения для переменной PROMPT1 приведен в листингах 6.8 и 6.9.

Листинг 6.8. Создание приглашения с именем хоста, портом и именем пользователя

testdb=# \set PROMPT1 '[*m:*>:*n;]«/)= '

[host:5432:postgres](testdb)=

Листинг 6.9. Создание приглашения с текущей датой, именем базы данных и именем пользователя

testdb=# \set PROMPT1 '\

[Fri Aug 3 21:44:30 POT 2001]

postgres:testdb=#



Графический клиент PgAccess

Программа PgAccess обеспечивает графический интерфейс для администрирования PostgreSQL. Она имеет много общего с управляющими программами таких СУБД для PC, как Microsoft Access.

Графический интерфейс позволяет просматривать и редактировать различные элементы баз данных PostgreSQL — таблицы, запросы и т. д. — в визуальном режиме. Это удобная альтернатива для интерфейса командной строки psql, который иногда бывает излишне утомительным и неудобным.

Программа PgAccess написана на сценарном языке Tcl/Tk, что упрощает ее адаптацию для других систем, поскольку программа устанавливается и работает во всех системах с поддержкой сценариев Tcl/Tk (включая Linux/Unix, Windows и MacOS). Приложение PgAccess работает на стороне клиента, причем наличие PostgreSQL на компьютере, на котором работает PgAccess, не обязательно.

Установка и базовая настройка

Подготовить PgAccess для работы с PostgreSQL относительно просто. Самое главное, чтобы в системе был установлен и правильно настроен пакет Tcl/Tk.

Поддержка Tel в PostgreSQL включается при помощи ключа -with-tcl на стадии компиляции. Ключ - -with-tcl производит автоматическую настройку библиотек Tel для PostgreSQL и устанавливает двоичный файл pgaccess.

ПРИМЕЧАНИЕ

Без поддержки Tcl/Tk в PostgreSQL программа PgAccess работать не будет. В поставках Linux, включающих PostgreSQL (таких, как Red Hat и Mandrake), двоичные файлы PostgreSQL откомпилированы с поддержкой Tel.

Если ключ --with-tcl не был установлен во время исходной компиляции, вы можете включить поддержку Tel в существующую конфигурацию PostgreSQL без повторной инициализации каталогов данных. Для этого следует переконфигурировать PostgreSQL с ключом -with-tcl и произвести повторную компиляцию.

После завершения переконфигурирования очистите каталог командой gmake clean и перекомпилируйте программу командой gmake. Завершите процесс postmaster и введите команду gmake i nstal 1. Команда устанавливает новые двоичные файлы и библиотеки в новой конфигурации PostgreSQL. После того как файлы установлены, остается лишь перезапустить PostgreSQL.

ВНИМАНИЕ

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

Операции с пользователями

PgAccess позволяет выполнять административные операции с учетными записями пользователей базы данных в графическом режиме. В PgAccess, как и в клиентах командной строки, при выполнении этих операций используются команды CREATE USER и ALTER USER, но PgAccess обеспечивает графический интерфейс к этим командам.

Щелчок на вкладке Users открывает список всех зарегистрированных пользователей базы данных. Из трех основных кнопок программы на вкладке Users используются только кнопки New и Design.

Кнопка New создает нового пользователя базы данных. Как нетрудно заметить, все основные элементы окна соответствуют параметрам команды SQL CREATE USER. В поле Username вводится имя нового пользователя, а поля Password и Verify Password предназначены для ввода пароля (если он есть). Флажки позволяют предоставить новому пользователю права CREATEDB и CREATEUSER (как говорилось выше, при наличии этих прав пользователь наделяется правами суперпользователя базы данных). В поле Valid until вводится срок действия учетной записи пользователя (по аналогии с командой CREATE USER).

Кнопка Design позволяет изменить атрибуты выделенной записи пользователя так, как это обычно делается командой SQL ALTER USER. Элементы этого окна также соответствуют различным вариантам команды ALTER USER и позволяют сменить имя пользователя или пароль, предоставить права CREATEDB и CREATEUSER (см. выше) или изменить срок действия учетной записи.

Операции с группами

В PgAccess версии 0.98.7, последней на момент выхода книги, управление группами не поддерживалось. Операции создания и модификации групп пользователей PostgreSQL следует выполнять в интерфейсе командной строки клиента psql.




Создание баз данных

Чтобы создать базу данных в PgAccess, перейдите на вкладку Database в верхней части экрана, затем щелкните на кнопке New и введите имя новой базы. Результат будет точно таким же, как при выполнении команды SQL CREATE DATABASE текущим пользователем. Чтобы использовать другой шаблон вместо templatel или выбрать тип кодировки, следует либо воспользоваться программой createdb, либо ввести команду CREATE DATABASE в клиенте командной строки (см. главу 9).

Создание таблиц

Графический интерфейс PgAccess позволяет относительно просто создавать таблицы и изменять их структуру.

Перейдите на вкладку Tables и щелкните на кнопке New. На экране появится диалоговое окно Create new table. Различные поля и кнопки этого окна предназначены для изменения атрибутов создаваемой таблицы. В целом эти элементы являются визуальными аналогами параметров команды SQL CREATE.

Ниже перечислены основные поля диалогового окна Create new table.

Table name. Имя создаваемой таблицы. Inherits. Таблица (или таблицы), от которых создаваемая таблица наследует атрибуты. Значения выбираются в раскрывающемся списке. Помните, что выбор не ограничивается одной таблицей; вы можете нажать кнопку со стрелкой и выбрать другую таблицу, имя которой также появляется в поле Inherits. Check. Выражения, которые должны проверяться при выполнении команд INSERT и UPDATE. Constraint. Ограничения, устанавливаемые для таблицы.

Ниже рассказано, как происходит включение в таблицу новых полей, а также вставка и удаление записей.

Включение новых полей в таблицу

Чтобы включить в таблицу новое поле, введите его атрибуты в полях field name, type, size и Default value; установите в нужное положение флажки field cannot be null и primary key. Завершив настройку атрибутов, щелкните на кнопке Add field, чтобы включить поле в список. Кнопки Move Up и Move Down позволяют перемещать поле в списке, кнопка Delete field удаляет поле, а кнопка Delete All удаляет все поля.

Когда все будет готово к включению поля в базу данных, щелкните на кнопке Create.

Вставка и обновление записей

Клиент PgAccess также может использоваться для занесения данных в таблицы; более того, это довольно просто и удобно. Перейдите на вкладку Table и просмотрите список таблиц. Щелкните на той таблице, с которой вы хотите работать, затем — на кнопке Open.

На экране появляется «сетка», столбцы которой соответствуют полям таблицы. Перейдите к нужной ячейке нажатием клавиши Tab или просто щелкните на ней мышью. Запись выделяется цветом, и в ней появляется курсор, показывающий позицию ввода новых данных. База данных обновляется лишь после того, как вы перейдете к следующей ячейке нажатием клавиши Tab; также можно щелкнуть в другой ячейке кнопкой мыши. После одного из этих действий PgAcccess выводит сообщение «Updating database...».

Обратите внимание: PgAccess позволяет сортировать и фильтровать данные в таблицах при помощи полей Sort field и Filter conditions, расположенных в верхней части окна. Чтобы отсортировать таблицу по одному полю, введите его имя в поле Sort field с необязательным ключевым словом ASC (сортировка по возрастанию) или DESC (сортировка по убыванию). Также возможна сортировка по нескольким полям, для этого имена полей перечисляются через запятую. Например, сортировка поля lastname по возрастанию выполняется следующим образом: lastname ASC

Критерии фильтрации записей состоят из условных конструкций следующего вида:

(аде < 45) and (avgsalary > 40000)

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

Удаление данных

Чтобы удалить данные из таблицы, откройте ее точно так же, как для вставки: перейдите на вкладку Tables, щелкните на имени таблицы и затем — на кнопке Open. На экране появляется «сетка», заполненная данными. Удалять можно как целые записи, так и отдельные поля в записях. Чтобы удалить запись, щелкните в соответствующей строке и нажмите клавишу Delete. PgAccess выводит диалоговое окно с предложением подтвердить удаление (на случай, если клавиша была нажата случайно). Чтобы полностью или частично удалить содержимое поля, щелкните в соответствующей ячейке (или перейдите к ней нажатием клавиши Tab) и удалите лишние символы нажатием клавиши Backspace.

Работа с запросами

Как нетрудно предположить, в PgAccess предусмотрены средства конструирования, редактирования и выполнения запросов. Щелкните на вкладке Queries — вы увидите список существующих запросов, определенных в базе данных. Пользователям Microsoft Access эта часть интерфейса программы покажется знакомой — визуальный конструктор запросов PostgreSQL очень похож на аналогичное средство Access.

Новый запрос создается щелчком на кнопке New, при этом на экране открывается окно Query Builder. Прежде чем переходить к конструированию запроса, введите его имя в поле Query name. Имя выбирается произвольно и никак не влияет на работу запроса. Оно нужно только для того, чтобы запрос отличался от других запросов в списке. На этой стадии также можно ввести комментарии к запросу.

Ручное построение запроса

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

Визуальное конструирование запроса

Чтобы создать запрос в визуальном конструкторе, щелкните на кнопке Visual Designer. Как упоминалось выше, по своему интерфейсу этот инструмент напоминает конструктор запросов Microsoft Access. Изначально область конструирования запроса пуста. Чтобы разместить в ней новую таблицу, введите имя таблицы в поле раскрывающегося списка Add table, где по умолчанию размещается курсор. Также можно раскрыть список существующих таблиц и выбрать таблицу там.

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

Чтобы удалить таблицу из области конструирования запроса, щелкните на ее имени и нажмите клавишу Delete. Удаление связей выполняется аналогично — выделением связи и нажатием клавиши Delete.

Все связи между таблицами преобразуются в секции WHERE, определяющей условия логического объединения двух таблиц. Связи представляют условия, основанные на операторе =. Чтобы задать другое условие, отредактируйте команду SQL в окне Query Builder. Учтите, что при возвращении в режим визуального конструирования и последующем сохранении все модификации связей вернутся к условию равенства.

Чтобы выбрать поля, входящие в итоговый набор запроса, перетащите их в область результата (разделенная на ячейки область в нижней части экрана). В поле Criteria можно ввести условия, применяемые к результатам запроса. Чтобы просмотреть команду SQL, сгенерированную по итогам визуального конструирования, щелкните на кнопке Show SQL. Кнопка Execute SQL позволяет выполнить созданный запрос (с целью тестирования). Завершив построение запроса, щелкните на кнопке Save to query builder. Запрос сохраняется в таблице pga_queries.

Выполнение запроса

Чтобы просмотреть результаты выполнения запроса, перейдите на вкладку Queries, выберите нужный запрос в списке и щелкните на кнопке Open. На экране появляется окно, напоминающее окно редактирования таблицы, но доступное только для чтения. Поле Sort используется для сортировки записей по результатам выражения, а в поле Filter conditions вводится выражение для фильтрации записей.

Модификация запроса

Чтобы изменить существующий запрос, перейдите на вкладку Queries, выберите запрос в списке и щелкните на кнопке Design. На экране появляется окно Query Builder, в котором отображается имя запроса, сгенерированная команда SQL, а также все комментарии, введенные при исходном конструировании. Вы можете отредактировать код SQL вручную или воспользоваться визуальным конструктором. Кнопка Save query definition позволяет сохранить изменения в существующем запросе.

Создание функций

Чтобы создать в PgAccess новую функцию, перейдите на вкладку Functions и щелкните на кнопке New. В открывшемся окне вводится имя новой функции, список параметров (разделенный запятыми), язык, на котором написана функция (SQL, С, plpgsql и т.д.) и тип возвращаемого значения. Тело функции вводится в многострочном поле, занимающем большую часть экрана (или в отдельном файле, если это функция С). Завершив ввод, щелкните на кнопке Save.

ПРИМЕЧАНИЕ

Вы можете просматривать определения существующих функций. Для этого следует выбрать нужную функцию в списке и щелкнуть на кнопке Open.

Мы вернемся к теме создания функций в следующей главе.