CRUD в разработке программ: что это и как работает
Разбираем CRUD: четыре базовые операции с данными в SQL, NoSQL, HTTP и REST API. Где используется и какие ошибки встречаются


В мире программ по работе с данными, вне зависимости от языка программирования, зачастую требуются похожие действия.
Чтобы упростить взаимодействие между совершенно разными системами и сделать проекты понятнее, придумали CRUD-операции.
CRUD - это аббревиатура с английского языка, означающая 4 типовых операции:
create - создание
read - чтение
update - обновление (полное или частичное)
delete - удаление
CRUD операции знакомы и применимы практически везде, где необходимо работать с данными:
базы данных
мобильные приложения
десктопные приложения для компьютера
API сервисы
веб-сайты: интернет-магазины, блоги, админ-панели
CRUD описывает действия над данными, как паттерн (поведение), имя же операции в конкретном языке или технологии может отличаться.
В реляционных базах данных CRUD записывается четырьмя командами: INSERT, SELECT, UPDATE и DELETE.
INSERT INTO posts (title, text) VALUES ('Привет', 'Первая статья');
SELECT * FROM posts WHERE id = 5;
UPDATE posts SET title = 'Новый заголовок' WHERE id = 5;
DELETE FROM posts WHERE id = 5;пример CRUD операций в SQL
В нереляционных базах данных (NoSQL) на примере MongoDB, операции называются иначе: insertOne(), find(), updateOne() и deleteOne().
db.posts.insertOne({ title: "Первый заголовок", text: "Первая статья" })
db.posts.find({ _id: 5 })
db.posts.updateOne({ _id: 5 }, { $set: { title: "Новый заголовок" } })
db.posts.deleteOne({ _id: 5 })пример CRUD операций в NoSQL
HTTP протокол использует отдельный метод для каждой операции:
POST создаёт
GET читает
PUT заменяет запись целиком
PATCH меняет только переданные поля
DELETE удаляет
В REST API ресурс определяет путь ссылки, а действие HTTP метод.
Для примера: /posts/5/ может читать, обновлять и удалять строку в базе данных, в зависимости от метода.
POST /posts/ создать статью
GET /posts/ получить список статей
GET /posts/5/ получить одну статью
PATCH /posts/5/ изменить часть полей статьи
DELETE /posts/5/ удалить статьюпример CRUD в REST API
В зависимости от результата обработки запроса REST API может вернуть разный ответ: например 200 OK при чтении и обновлении или 404 Not Found, если не найдено.
| Операция | SQL | NoSQL (на примере MongoDB) | HTTP | REST API путь |
|---|---|---|---|---|
| Create | INSERT | insertOne() | POST | POST /posts/ |
| Read | SELECT | find() | GET | GET /posts/5/ |
| Update | UPDATE | updateOne() | PUT / PATCH | PATCH /posts/5/ |
| Delete | DELETE | deleteOne() | DELETE | DELETE /posts/5/ |
Для лучшего понимания, ниже, рассмотрим подробнее каждую из четырех операций, на примере каталога сайта интернет магазина.
У каждого товара будет id - идентификатор, name - наименование, price - цена и quantity - остаток.
Create в CRUD это операция по созданию нового экземпляра.
Менеджер заполняет в админке форму и нажимает сохранить.

Сервер получает данные в таком формате:
POST /products/
Content-Type: application/json
{"name": "Кофемашина", "price": 24990, "quantity": 15}пример HTTP POST запроса для создания записи в CRUD
После различных проверок в коде, отправляется запрос в базу данных:
INSERT INTO products (name, price, quantity) VALUES ('Кофемашина', 24990, 15);пример SQL CREATE в CRUD
Если код успешно отработал и используются стандартная логика написания кода, то вернется ответ201 Created, а в базе данных и следовательно в админ панели отобразится только созданный товар.
Менеджер может посмотреть список товаров или один конкретный товар, обе операции подходят под сценарий READ - чтение.

Сервер получит запрос в одном из форматов, с методом GET.
GET /products/ все товары
GET /products/5/ один конкретный товарпример HTTP GET запроса для чтения записи в CRUD
После разных действий кода, SQL получит запрос следующего формата:
SELECT id, name, price FROM products LIMIT 10; -- все товары
SELECT * FROM products WHERE id = 5; -- 1 конкретный товарпример SQL READ в CRUD
При успешном получении данных, сервер вернет их с кодом 200 OK, если конкретный товар не найден вернется 404 Not Found.
Update предназначен для обновления данных записи в базе данных.
Менеджер решил немного исправить прежде созданный товар, опечатался в цене.

В HTTP есть метод PUT для полной перезаписи и PATCH для частичного изменения полей.
PUT /products/5/
Content-Type: application/json
{"name": "Кофемашина", "price": 22990, "quantity": 15}пример HTTP PUT запроса для полного изменения записи в CRUD
PATCH /products/5/
Content-Type: application/json
{"price": 22990}пример HTTP PATCH запроса для частичного изменения записи в CRUD
| PUT | PATCH | |
|---|---|---|
| Что делает | Заменяет запись целиком | Меняет только указанные поля |
| Что передаём | Все поля: name, price, quantity | Только изменённые, например price |
| Пропущенное поле | Сбросится или вызовет ошибку | Останется прежним |
| Когда использовать | Форма редактирования, где видны все поля | Точечная правка: цена, остаток |
В SQL не будет разницы между частичным или полным изменением, сама разница обычно прописывается в логике кода.
-- PUT: обновляем все поля
UPDATE products SET name = 'Кофемашина', price = 22990, quantity = 15 WHERE id = 5;
-- PATCH: только цену
UPDATE products SET price = 22990 WHERE id = 5;пример SQL UPDATE в CRUD c возможностью обновить 1 поле или несколько
Сервер ответит ошибкой 404 Not Found, если товар не найден, 400 - если данные не прошли проверку, 200 OK если обновление прошло успешно или 204 No Content если код ничего не возвращает.
Delete предназначен для уничтожения записи из базы данных.
Менеджер ошибся еще и в названии и в количестве, потому решил что быстрее удалить и создать товар заново.

Жёсткое (hard delete) удаление самая опасная из четырёх операций: ошибку часто нельзя отменить, поэтому при проектировании систем к удалению относятся осторожнее, чем к остальным.
Чтобы удаленная запись не навредила пользователям и системе, придумали такое понятие как soft delete (мягкое удаление), запись в базе данных остается, однако помечается галочкой как удаленная или добавляется дата удаления, именно потому крупные веб-порталы и сервисы при утечках теряют и казалось бы навсегда удаленные данные.
Soft delete (мягкое удаление) полезно интернет магазинам или иным сервисам, где важно видеть историю активностей.
| Жёсткое (hard delete) | Мягкое (soft delete) | |
|---|---|---|
| Что происходит | Строка удаляется из базы | Ставится флаг is_active = FALSE или дата удаления |
| Восстановление | Невозможно (только из бэкапа) | Возможно |
| Старые заказы | Могут сломаться или не дадут удалить товар | Остаются целыми |
| Работа после | Проще | Везде нужно фильтровать скрытые товары |
Сервер получает стандартный DELETE, как в примере ниже, однако разработчик может изменить поведение кодом на soft delete (мягкое удаление).
DELETE /products/5/пример HTTP DELETE запроса для удаления записи в CRUD
DELETE FROM products WHERE id = 5;пример SQL HARD DELETE в CRUD
UPDATE products SET is_active = FALSE WHERE id = 5;пример SQL SOFT DELETE в CRUD
При успешном удалении сервер ответит кодом 204 No Content или200 OK.
При отсутствии записи, ответит кодом 404 Not Found.
CRUD приложение это некая программа или ее часть, где вся логика строится вокруг действий описанных в этой статье: создавать, смотреть, изменять и удалять записи.
Типовое CRUD приложение состоит из нескольких слоев (таблица ниже).
| Слой | Что делает | Примеры технологий |
| Хранилище | Хранит записи | PostgreSQL, MySQL, SQLite, MongoDB |
| Серверная часть | Принимает запросы, проверяет данные и права, выполняет операции | Django, Laravel, Express, Spring, Wordpress |
| Интерфейс | Даёт пользователю список, карточку и формы | веб приложение, мобильное или десктопное приложение |
Одна сущность - объект из базы данных (например, товар) обычно требует пять экранов:
Список товаров для просмотра (READ): каталог с пагинацией, поиском и фильтрами.
Карточка конкретного товара (Read): страница одной записи.
Создание (Create): форма добавления.
Редактирование (Update): форма с существующими значениями.
Страница удаления (Delete): страница или диалог с подтверждением «Вы уверены?».
CRM и ERP: клиенты, сделки, счета
админ панели и CMS (Django, Wagtail, DjangoCMS, WordPress)
интернет-магазины: каталог, заказы, клиенты
таск-трекеры: задачи, проекты, комментарии
списки дел, заметки, адресные книги
учебные проекты: блог, список задач, каталог книг
Студентам часто дают задачу "написать CRUD приложение" потому что:
охватывает многие дополнительные темы (проверка данных и доступов, проектирование маршрутов, работа с базой данных и формами, отображение шаблонов)
можно дать уникальное задание: кому-то интернет магазин книг, а кому-то учет животных в зоопарке
такой проект долгоиграющий, можно бесконечно создавать более сложные задачи
результат легко проверить и выявить ошибки за пару кликов
это реальный навык, который можно использовать на другом языке/фреймворке в будущем
Это один из первых серьезных вызовов для студента, чтобы проверить свои знания, расширить мировоззрение и подтянуть навыки.
Если у вас остались вопросы по теме CRUD, вы можете связаться с программистом.
По необходимости вы можете обратиться за консультацией
Вам может быть интересно
Django CBV: готовые классы на примере Generic Base View

Ваш первый сайт на Django: обзор фреймворка на Python

Как создать виртуальное окружение python venv
Django CBV: что такое Class-Based Views и зачем они

Как открыть XML-файл и посмотреть его в читаемом виде
