
        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
