1. Основы реляционных баз данных и язык SQL на примере PostgreSQL
Основы реляционных баз данных и язык SQL на примере PostgreSQL
Добро пожаловать на курс «Python Backend: Базы данных, FastAPI и Django». Вы уже освоили синтаксис Python, умеете писать функции и работать с классами. Но до сих пор ваши программы, скорее всего, «забывали» всё, что происходило, как только вы их выключали. Переменные очищаются, оперативная память освобождается.
Чтобы создавать полноценные веб-сервисы, нам нужно место для надежного хранения информации: пользователей, заказов, сообщений. Для этого используются базы данных.
В этой статье мы разберем, как устроены реляционные базы данных, почему PostgreSQL — это стандарт индустрии для Python-разработчиков, и научимся говорить с базой на её языке — SQL.
Что такое база данных и СУБД?
Представьте себе огромную, очень умную и быструю таблицу Excel, которой могут пользоваться тысячи людей одновременно, и она никогда не зависает. Это упрощенное описание базы данных.
Если говорить точнее, то База Данных (БД) — это само хранилище информации, упорядоченный набор данных. А программа, которая управляет этим хранилищем, называется СУБД (Система Управления Базами Данных).
В мире Python-бэкенда самой популярной СУБД является PostgreSQL (или просто «Постгрес»). Это мощная, бесплатная система с открытым исходным кодом, которая славится своей надежностью и соответствием стандартам.
Реляционная модель данных
Слово «реляционная» происходит от английского relation (отношение). В таких базах данные хранятся в таблицах, которые связаны друг с другом.
Давайте разберем анатомию таблицы на примере интернет-магазина:
users для пользователей). !Диаграмма, показывающая связь между таблицей пользователей и таблицей заказов через внешний ключ.
Первичный ключ (Primary Key)
Как отличить одного пользователя от другого, если их обоих зовут Иван Иванов? В реляционных базах у каждой строки должен быть уникальный идентификатор. Он называется Primary Key (обычно это столбец id).
Внешний ключ (Foreign Key)
Это «клей», который соединяет таблицы. Если пользователь сделал заказ, мы не пишем имя пользователя в таблицу заказов (вдруг он сменит имя?). Мы пишем туда его id. Столбец в таблице заказов, который ссылается на id пользователя, называется Foreign Key.
Язык SQL
Чтобы управлять данными, мы используем язык SQL (Structured Query Language — язык структурированных запросов). Это не язык программирования в привычном смысле (как Python). Это декларативный язык: вы говорите базе что вы хотите получить, а она сама решает, как это сделать.
Основные операции с данными часто называют аббревиатурой CRUD:
* Create (Создание) * Read (Чтение) * Update (Обновление) * Delete (Удаление)
Давайте посмотрим, как это выглядит на практике в PostgreSQL.
Создание таблицы (DDL)
Прежде чем добавлять данные, нужно создать структуру. Команды, определяющие структуру, относятся к группе DDL (Data Definition Language).
Разберем, что здесь написано:
* SERIAL: Специальный тип данных в Postgres. Это целое число, которое автоматически увеличивается с каждой новой записью (1, 2, 3...).
* PRIMARY KEY: Говорит о том, что это поле — главный идентификатор.
* VARCHAR(50): Строка длиной до 50 символов.
* NOT NULL: Поле не может быть пустым.
* UNIQUE: Значение должно быть уникальным во всей таблице (двух пользователей с одинаковым email быть не может).
Добавление данных (INSERT)
Теперь наполним таблицу. Это уже DML (Data Manipulation Language).
Обратите внимание: мы не указывали id, так как тип SERIAL сгенерирует его сам.
Чтение данных (SELECT)
Самая частая операция. Чтобы получить все данные из таблицы:
Звездочка * означает «все столбцы». Но часто нам нужно найти что-то конкретное. Для этого используется оператор WHERE (где).
Этот запрос вернет только имена и почты активных пользователей.
Обновление данных (UPDATE)
Допустим, Иван решил сменить никнейм.
Важно: Всегда используйте WHERE при обновлении! Если вы забудете написать условие, база данных обновит все строки в таблице. Это классическая ошибка новичка.
Удаление данных (DELETE)
Удалим пользователя:
Здесь правило то же: без WHERE вы удалите всю таблицу целиком.
Связи между таблицами
Сила реляционных баз — в связях. Давайте создадим таблицу постов для блога, которые пишут наши пользователи.
Строка user_id INTEGER REFERENCES users(id) создает внешний ключ. Она говорит Postgres: «В этой колонке могут быть только такие числа, которые реально существуют в колонке id таблицы users». Это обеспечивает целостность данных. Вы не сможете создать пост от несуществующего пользователя.
Чтобы получить посты вместе с именами авторов, мы используем операцию JOIN (объединение):
Этот запрос «склеит» две таблицы в одну виртуальную таблицу, сопоставив строки, где user_id в постах совпадает с id в пользователях.
Транзакции и ACID
Одной из важнейших особенностей PostgreSQL является поддержка транзакций.
Транзакция — это группа последовательных операций с базой данных, которая выполняется как единое целое. Либо выполняются все команды успешно, либо, если хоть одна сломалась, не выполняется ни одна.
Представьте банковский перевод: нужно списать деньги у одного клиента и начислить другому. Если деньги списались, а начислить не удалось (ошибка сети), деньги просто исчезнут. Транзакции предотвращают это.
Надежность баз данных описывается аббревиатурой ACID:
Заключение
Сегодня мы познакомились с фундаментом бэкенд-разработки. Базы данных — это не просто файлы, это сложные инженерные системы, гарантирующие сохранность данных.
Мы изучили:
* Что такое таблицы, строки и столбцы.
* Зачем нужны Primary Key и Foreign Key.
* Базовые SQL-команды: CREATE, INSERT, SELECT, UPDATE, DELETE.
* Концепцию связей между таблицами.
В следующих статьях мы узнаем, как управлять этими процессами не вручную через SQL-консоль, а автоматически — с помощью кода на Python, используя драйверы и ORM (Object-Relational Mapping) внутри FastAPI и Django.