psql Посмотрим список имеющихся баз: psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) Пока нас интересует только название, значение остальных полей рассмотрим позже. ----------------------------------------------------------------------- Также можно посмотреть в самой базе данных: => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 (3 rows) * datistemplate - является ли база данных шаблоном; * datallowconn - разрешены ли соединения с базой данных, * datconnlimit - максимальное количество соединений (-1 = без ограничений). При необходимости флаги можно изменить с помощью обычного update. ----------------------------------------------------------------------- Подключимся к базе template1 и установим расширение pgcrypto. Дальше мы увидим, что новые БД будут создаваться уже с этим расширением. => \c template1 You are now connected to database "template1" as user "postgres". => create extension pgcrypto; CREATE EXTENSION Если бы расширение pgcrypto не было установлено с помощью make install, мы получили бы ошибку "ERROR: could not open extension control file..." ----------------------------------------------------------------------- Теперь нам доступны функции, входящие в расширение pgcrypto. Например, можно вычислить MD5-дайджест: => select digest('Hello, world!', 'md5'); digest ------------------------------------ \x6cd3556deb0da54bca060b4c39479839 (1 row) ----------------------------------------------------------------------- Чтобы шаблон можно было использовать для создания базы, к нему не должно быть активных подключений, поэтому отключимся от базы template1. => \c postgres You are now connected to database "postgres" as user "postgres". ----------------------------------------------------------------------- Для создания новой базы данных служит команда CREATE DATABASE: => create database test; CREATE DATABASE => \c test You are now connected to database "test" as user "postgres". Также можно воспользоваться утилитой createdb: $ createdb test => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 test | f | t | -1 (4 rows) ----------------------------------------------------------------------- По умолчанию при создании используется шаблон template1. Убедимся, что в новой базе доступно расширение pgcrypto: => select digest('Hello, world!', 'md5'); digest ------------------------------------ \x6cd3556deb0da54bca060b4c39479839 (1 row) ----------------------------------------------------------------------- А если создать базу данных из шаблона template0? => create database test0 template template0 connection limit 20; CREATE DATABASE => \c test0 You are now connected to database "test0" as user "postgres". Здесь мы указали не только имя шаблона, но и максимальное количество соединений: => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 test | f | t | -1 test0 | f | t | 20 (5 rows) ----------------------------------------------------------------------- Проверим: => select digest('Hello, world!', 'md5'); ERROR: function digest(unknown, unknown) does not exist LINE 1: select digest('Hello, world!', 'md5'); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ----------------------------------------------------------------------- Рассмотрим несколько полезных функций для вычисления занимаемого объема. Размер базы данных: => select pg_database_size('test0'); pg_database_size ------------------ 6434132 (1 row) Чтобы не считать разряды, можно вывести размер в читаемом виде: => select pg_size_pretty(pg_database_size('test0')); pg_size_pretty ---------------- 6283 kB (1 row) ----------------------------------------------------------------------- Создадим таблицу и индекс: => create table t(n numeric); CREATE TABLE => create index t_idx on t(n); CREATE INDEX => insert into t select * from generate_series(1, 10000); INSERT 0 10000 ----------------------------------------------------------------------- Теперь можно вывести размер, занимаемый таблицей: => select pg_size_pretty(pg_table_size('t')); pg_size_pretty ---------------- 392 kB (1 row) ----------------------------------------------------------------------- А также размер индексов таблицы: => select pg_size_pretty(pg_indexes_size('t')); pg_size_pretty ---------------- 240 kB (1 row) И размер таблицы вместе с индексами: => select pg_size_pretty(pg_total_relation_size('t')); pg_size_pretty ---------------- 632 kB (1 row) ----------------------------------------------------------------------- Созданную базу данных можно переименовать: => alter database test rename to db; ALTER DATABASE => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 test0 | f | t | 20 db | f | t | -1 (5 rows) ----------------------------------------------------------------------- Изменить количество соединений: => alter database db connection limit 10; ALTER DATABASE => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 test0 | f | t | 20 db | f | t | 10 (5 rows) ----------------------------------------------------------------------- Базу данных можно удалить (если к ней нет активных подключений). Поскольку мы подключены к другой базе, то удаление пройдет успешно: => \conninfo You are connected to database "test0" as user "postgres" via socket in "/tmp" at port "5432". => drop database db; DROP DATABASE => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 test0 | f | t | 20 (4 rows) ----------------------------------------------------------------------- Удалим и вторую базу. => \c postgres You are now connected to database "postgres" as user "postgres". => drop database test0; DROP DATABASE => select datname, datistemplate, datallowconn, datconnlimit from pg_database; datname | datistemplate | datallowconn | datconnlimit -----------+---------------+--------------+-------------- template1 | t | t | -1 template0 | t | f | -1 postgres | f | t | -1 (3 rows) ----------------------------------------------------------------------- Если база данных не существует, команда DROP DATABASE будет ругаться: => drop database db; ERROR: database "db" does not exist Поэтому можно воспользоваться другой формой (она применима и к удалению других объектов): => drop database if exists db; NOTICE: database "db" does not exist, skipping DROP DATABASE Конец демонстрации. ----------------------------------------------------------------------- => \q