PostgreSQL start
Теория
Виды баз данных
Базы данных бывают двух видов:
- Реляционные — (SQL) — база, где данные хранятся в формате таблиц, они строго структурированы и связаны друг с другом.
В них, обычно, планируются несерьезные, неглобальные изменения. Они могут использовать сложные запросы и набор отношений.
- Нереляционные — (NoSQL) — такие базы хранят данные без четких связей друг с другом и четкой структуры.
Они могут как иметь, так и не иметь отношения, не имеют четкой структуры и меняются в процессе.
Структура
При использовании баз данных, используется следующая структура:
БД (база данных) └─СУБД (система управления базами данных) └─пользователь
Между базой данных и пользователем используется СУБД - система управления базами данных - специальное ПО обеспечивающее взаимодействие пользователя с базой данных.
Реляционная БД
PostgreSQL является реляционной базой данных. Она состоит из следующих частей:
- сущность (таблица) - представляет тип объектов, которые должны храниться в базе данных.
- поле - часть таблицы, за которой закреплен определенный тип данных. (оно содержит название и описание)
- запись - строка таблицы (поле) базы данных, содержащая набор значений и свойств размещенный в полях.
- поле - часть таблицы, за которой закреплен определенный тип данных. (оно содержит название и описание)
Структура базы данных:
БД ├───таблица │ ├───поле │ │ └запись │ ├───поле │ │ └запись │ └───поле │ └запись ├───таблица │ ├───поле │ │ └запись │ ├───поле │ │ └запись │ └───поле │ └запись └───таблица ├───поле │ └запись ├───поле │ └запись └───поле └запись
Пример базы данных в использовании в библиотеке:
БД ├───автор │ ├───библиография │ ├───биография │ ├───дата рождения │ └───имя ├───книги ├───абонементы └───сотрудник
В данном примере:
- БД - база данных;
- автор, книги, абонементы, сотрудник - таблицы;
- библиография, биография, дата рождения, имя - поля.
- автор, книги, абонементы, сотрудник - таблицы;
Типы данных
Так же, как переменные в программировании, поля в базах данных имеют различные типы. Какой тип Вы укажете (текстовый или числовой) такие данные там и будут хранится.
Числовые типы
- smallint - Маленькое целое число (2 байта)
- integer или int - Обычное целое число (4 байта)
- bigint - Большое целое число (8 байт)
- decimal(p,s) или numeric(p,s) - Точное число с фиксированной точностью
- real - Число с плавающей точкой (4 байта)
- double precision - Число с плавающей точкой (8 байт)
- serial - Автоинкрементное целое (4 байта)
- bigserial - Автоинкрементное большое целое (8 байт)
Строковые типы
- char(n) - Фиксированная длина строки
- varchar(n) - Строка переменной длины (до n символов)
- text - Строка произвольной длины
Типы даты и времени
- date - Только дата
- time - Только время
- timestamp - Дата и время без часового пояса
- timestamptz (или timestamp with time zone) - Дата и время с часовым поясом
- interval - Промежуток времени
Булев тип
- boolean Истина (true) или ложь (false)
Типы для идентификаторов
- uuid - Уникальный идентификатор (UUID)
Массивы
- integer[], text[], uuid[] и т.д.
JSON и XML
- json - Неструктурированные JSON-данные
- jsonb - Бинаризованный JSON (удобнее для индексации)
- xml - XML-данные
Специальные типы
- bytea - Бинарные данные ("byte array")
- inet - IP-адреса
- cidr - Сети IP-адресов
- macaddr - MAC-адреса
Практика
Установка PostgreSQL
Версии программы
версия | пакет |
---|---|
15 | postgresql15-server |
14 | postgresql14-server |
14-1C | postgresql14-1C-server |
13 | postgresql13-server |
12 | postgresql12-server |
11 | postgresql11-server |
10 | postgresql10-server |
9.6 | postgresql9.6-server |
Установка
Установим сервер:
$ su - # apt-get install postgresql15-server
# /etc/init.d/postgresql initdb
Добавим его в автозапуск и запустим:
# systemctl enable --now postgresql
Shell СУБД
Запуск
$ psql -U postgres postgres=#
Работа с пользователями
Просмотр всех пользователей
postgres=# \du
Удаление пользователя
=# DROP USER petr;
Изменение пароля пользователя
=# ALTER USER petr PASSWORD 'password'
Админские права
> GRANT ALL PRIVILEGES ON DATABASE "petrdb" to petr;
Создание ограниченного пользователя PostgresSQL
- имя пользователя - name
- пароль - Мойдодыр39 [en]
- имя db - petrdb
Создаем роль (пользователя) petr
- WITH LOGIN означает, что эта роль сможет входить в систему (подключаться к серверу PostgreSQL, как пользователь).
- PASSWORD 'Мойдодыр39' задаёт пароль для этой роли.
> CREATE ROLE petr WITH LOGIN PASSWORD 'Vjqljlsh39';
Назначение прав
Подключаться к БД, создавать новые объекты и временные таблицы
- CONNECT — позволяет пользователю подключаться к базе petrdb.
- CREATE — позволяет пользователю создавать новые объекты внутри базы данных (например, новые схемы).
- TEMPORARY — позволяет создавать временные таблицы в базе данных.
> GRANT CREATE, CONNECT, TEMPORARY ON DATABASE petrdb TO petr;
Просмотр схемы, обращение к объектам в схеме
> GRANT USAGE ON SCHEMA public TO petr;
USAGE на схему public означает:
- пользователь может видеть схему,
- может обращаться к объектам в схеме (но без права изменять объекты, пока отдельно не выдано разрешение).
Права на все существующие таблицы
> GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON ALL TABLES IN SCHEMA public TO petr;
Данная команда даёт права на все существующие таблицы в схеме public:
- SELECT — читать данные,
- INSERT — вставлять данные,
- UPDATE — изменять данные,
- DELETE — удалять записи,
- REFERENCES — создавать внешние ключи (FOREIGN KEY) на эти таблицы.
Права на все существующие последовательности
> GRANT USAGE, SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO petr;
Даёт права на все существующие последовательности (SEQUENCE, используются для генерации автоинкрементных ID) в схеме public:
- USAGE — право использовать последовательность (например, получать её текущее значение),
- SELECT — читать текущее значение последовательности,
- UPDATE — изменять значение (например, устанавливать nextval вручную).
Права по умолчанию на таблицы
> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON TABLES TO petr;
Устанавливает права по умолчанию:
- На все будущие таблицы, которые будут созданы в схеме public.
- Пользователь name сразу будет иметь права SELECT, INSERT, UPDATE, DELETE, REFERENCES на новые таблицы без необходимости вручную давать права каждый раз.
Права по умолчанию для новых последовательностей
> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO petr;
- Аналогично предыдущему пункту, но для новых последовательностей:
- Устанавливаются права на USAGE, SELECT, UPDATE для всех последовательностей, созданных в будущем в схеме public.
Подключение ограниченного пользователя к БД
Чтобы подключиться ограниченному пользователю к БД используйте следующую команду:
> psql -U user \database_name
Например:
> psql -U petr \petrdb
Управление БД
Создание/удаление
- Вывести список БД:
\l
- Создать БД:
CREATE DATABASE database_name;
- Создать, если не существует
SELECT 'CREATE DATABASE exp_db' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'exp_db')\gexec
- Удалить БД:
drop database name;
- Удалить, если существует
SELECT 'DROP DATABASE petr' WHERE EXISTS (SELECT FROM pg_database WHERE datname = 'petr')\gexec
Работа с сущностями
База данных ├подключиться к базе данных: \c ''name''; ├отобразить список баз данных: \l или \list; ├создать базу данных: createdb ''name''; ├удалить базу данных: drop database ''name''; или drop database if exists ''name''; └── Сущность ├ вывести список сущностей (таблиц) (из-под подключенной БД): \dt ├ создать сущность (таблицу) (из-под подключенной БД): create table ''name''(''запись'' ''тип'' ''атрибуты'', ''запись'' ''тип'' ''атрибуты''); ├ удалить сущность (таблицу) (из-под подключенной БД): drop table ''name''; └── Записи ├ ввести данные соответственно типам: insert into ''имя таблицы'' values (''значение записи в соответствии с типом'', ''значение записи в соответствии с типом''); ├ вывести записи таблицы: \d имя_таблицы'; ├ вывести все значения таблицы: select * from ''имя таблицы''; ├ вывести определенные значения таблицы: select ''имя столбца'', ''имя столбца'' from ''имя таблицы'' where '''(условие)'''; ├ изменить все значения записи: update ''имя таблицы'' set ''запись'' = ''значение''; ├ изменить определенные значения записи: update ''имя таблицы'' set ''запись'' = ''значение'' where '''(условие)'''; ├ удаление всех записей: delete from ''имя таблицы''; └ удаление определенной записи: delete from ''имя таблицы'' where '''(условие)''';
Создание БД
- смотрим, что у нас нет никаких БД
- создаем БД test
- подключаемся к ней.
>\l; >create database test; >\c test;
- Создаем таблицу "авторы"
>create table authors (id int, name varchar(30), lastname varchar(30), middlename varchar(30), books text, rating numeric(3,2));
ИЛИ:
CREATE TABLE authors ( id SERIAL PRIMARY KEY, name VARCHAR(30), lastname VARCHAR(30), middlename VARCHAR(30), books text, rating NUMERIC(3,2) -- например, рейтинг 0.00–9.99 );
- смотрим список таблиц и выводим содержимое таблицы
>\dt >\d authors;
> \d authors; Таблица "public.authors" Столбец | Тип | Правило сортировки | Допустимость NULL | По умолчанию ------------+-----------------------+--------------------+-------------------+-------------- id | integer | | | name | character varying(30) | | | lastname | character varying(30) | | | middlename | character varying(30) | | | books | text | | | rating | numeric(3,2) | | |
Ввод данных
По типам данных вводим данные
> insert into authors values (1, 'Лев', 'Толстой', 'Николаевич', 'Война и мир', '5'); > insert into authors values (2, 'Федор', 'Достоевский', 'Михаилович', 'Преступление и наказание', '4');
Так же, если не нужно заполнять все данные, можно это сделать выборочно:
> INSERT INTO authors (name, lastname, rating) VALUES ('Лев', 'Толстой', '5');
И множественно:
> insert into authors(name, lastname, rating) values('noname','noname',3), ('noname2', 'noname2',2);
Вывести новые значения таблицы:
Вывод
SELECT * FROM authors;
petrdb=# SELECT * FROM authors; id | name | lastname | middlename | books | rating ----+---------+-------------+------------+--------------------------+-------- 1 | Лев | Толстой | Николаевич | Война и мир | 5.00 2 | Федор | Достоевский | Михаилович | Преступление и наказание | 4.00 | Лев | Толстой | | | 5.00 | noname | noname | | | 3.00 | noname2 | noname2 | | | 2.00 (5 строк)
Обновление данных
Все
Изменить все значения записи:
update authors set rating = 1;
Вывести новые значения таблицы:
> select * from authors;
>select * from authors; id | name | lastname | middlename | books | rating ----+---------+-------------+------------+--------------------------+-------- 1 | Лев | Толстой | Николаевич | Война и мир | 1.00 2 | Федор | Достоевский | Михаилович | Преступление и наказание | 1.00 | Лев | Толстой | | | 1.00 | noname | noname | | | 1.00 | noname2 | noname2 | | | 1.00
Определенные
Изменить определенные значения записи:
update authors set rating = 1 where (условие);
Например:
update authors set rating = 5 where lastname='Толстой';
или
update authors set rating = 4 where rating<5;
или
update authors set rating = 3, middlename='nomiddlename' where lastname='noname';
Вывести новые значения таблицы:
> select * from authors; id | name | lastname | middlename | books | rating ----+---------+-------------+--------------+--------------------------+-------- 1 | Лев | Толстой | Николаевич | Война и мир | 5.00 | Лев | Толстой | | | 5.00 2 | Федор | Достоевский | Михаилович | Преступление и наказание | 4.00 | noname2 | noname2 | | | 4.00 | noname | noname | nomiddlename | | 3.00 (5 строк)
Удаление данных
Удаление определенной записи:
> delete from authors where name='Лев';
> select * from authors; id | name | lastname | middlename | books | rating ----+---------+-------------+--------------+--------------------------+-------- 2 | Федор | Достоевский | Михаилович | Преступление и наказание | 4.00 | noname2 | noname2 | | | 4.00 | noname | noname | nomiddlename | | 3.00 (3 строки)
Удаление определенной записи с логическим условием:
> delete from authors where rating=3 AND name='noname';
> select * from authors; id | name | lastname | middlename | books | rating ----+---------+-------------+------------+--------------------------+-------- 2 | Федор | Достоевский | Михаилович | Преступление и наказание | 4.00 | noname2 | noname2 | | | 4.00 (2 строки)
Удаление всей таблицы:
> delete from authors;
> select * from authors; id | name | lastname | middlename | books | rating ----+------+----------+------------+-------+-------- (0 строк)
Выборка данных
> select 'имя столбца', 'имя столбца' from 'имя таблицы' where '(условие)';
> select name, rating from authors where rating=5; name | rating ------+-------- Лев | 5.00 Лев | 5.00 (2 строки)
Условия
- =(условие)
- !=(условие)
- >, <, >=, <=
- (условие)AND(условие), (условие)OR(условие)
- between (значение) AND (значение);
- in (значение)
- not (значение)
Параметры
(пишутся в конце)
- limit n - где вместо n кол-во выводимых строк, вместо 1000 по-умолчанию;
- order by столбец
Рабочий сценарий
Установка
$ su - # apt-get install postgresql15-server
Настройка
# /etc/init.d/postgresql initdb
Добавим его в автозапуск и запустим:
# systemctl enable --now postgresql
Создаем пользователя и назначаем права
# psql -U postgres > CREATE ROLE petr WITH LOGIN PASSWORD '123';
где petr - пользователь, 123 - пароль
> CREATE DATABASE petrdb;
где petrdb - имя БД
Назначаем права на пользователя:
> GRANT CREATE, CONNECT, TEMPORARY ON DATABASE petrdb TO petr;
Позволяем использовать пользователю схему public:
> GRANT USAGE ON SCHEMA public TO petr;
Позволяем править все таблицы в схеме public:
> GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON ALL TABLES IN SCHEMA public TO petr;
Позволяем править все последовательности в схеме public:
> GRANT USAGE, SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO petr;
Назначаем дефолтные права таблиц в схеме для нашего пользователя:
> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON TABLES TO petr;
Назначаем дефолтные права последовательностей в схеме для нашего пользователя:
> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO petr;
Выходим
>\q #exit
Настройка БД пользователя
Подключаемся под админом к базе пользователя:
$ psql -U postgres -d petrdb
Назначаем права на чтение и правку пользователю:
petrdb=# GRANT USAGE, CREATE ON SCHEMA public TO petr; petrdb=# \q
Подключаемся под пользователем:
$ psql -U petr -d petrdb
Создаем БД:
petrdb=> create table authors (id int, name varchar(30), lastname varchar(30), middlename varchar(30), books text, rating numeric(3,2));
Вводим данные в таблицу:
petrdb=> insert into authors values (1, 'Лев', 'Толстой', 'Николаевич', 'Война и мир', '5');
Выводим переменные таблицы:
petrdb=> \d authors; Таблица "public.authors" Столбец | Тип | Правило сортировки | Допустимость NULL | По умолчанию ------------+-----------------------+--------------------+-------------------+-------------- id | integer | | | name | character varying(30) | | | lastname | character varying(30) | | | middlename | character varying(30) | | | books | text | | | rating | numeric(3,2) | | |
Выводим данные таблицы:
petrdb=> select * from authors; id | name | lastname | middlename | books | rating ----+------+----------+------------+-------------+-------- 1 | Лев | Толстой | Николаевич | Война и мир | 5.00 (1 строка)