• Bazy danych i SQL
  • CRUD w praktyce - SQL, REST API i Python bez typowych błędów

CRUD w praktyce - SQL, REST API i Python bez typowych błędów

Jeremi Andrzejewski 1 września 2026
Interfejs FastAPI pokazuje operacje CRUD: odczyt, tworzenie, aktualizację i usuwanie ptaków.

Spis treści

Dodajesz formularz rejestracji, listę produktów albo panel administracyjny i nagle okazuje się, że każda funkcja aplikacji musi pracować na danych. Właśnie wtedy pojawia się CRUD, czyli prosty model obejmujący tworzenie, odczytywanie, aktualizowanie i usuwanie informacji. Wyjaśnię, co oznaczają te operacje, jak łączą się z SQL, REST API i Pythonem oraz na jakie błędy trzeba uważać.

CRUD porządkuje cały cykl życia danych

  • CRUD oznacza Create, Read, Update i Delete.
  • W SQL operacje te realizują głównie INSERT, SELECT, UPDATE i DELETE.
  • CRUD opisuje pracę na danych, a nie konkretną bazę, język programowania ani framework.
  • W REST API operacje często łączą się z metodami POST, GET, PUT/PATCH i DELETE.
  • Największe ryzyka to brak warunku WHERE, podatność na SQL injection i niewłaściwe uprawnienia.

Terminal z zapytaniem do API zwracającym dane użytkownika.

CRUD to cztery podstawowe operacje na danych

CRUD jest akronimem od angielskich słów Create, Read, Update, Delete. Oznaczają one kolejno utworzenie nowego rekordu, odczyt danych, ich zmianę oraz usunięcie. Ten model spotkasz w niemal każdej aplikacji, która przechowuje informacje, od prostej listy zadań po system bankowy.

Najprościej wyobrazić sobie tabelę products z produktami w sklepie internetowym. Dodanie nowego produktu to Create, wyświetlenie katalogu to Read, zmiana ceny to Update, a usunięcie wycofanego produktu to Delete. CRUD porządkuje sposób myślenia o danych, dlatego jest tak często używany podczas projektowania aplikacji i API.

  • Create dodaje nową informację, na przykład konto użytkownika lub zamówienie.
  • Read pobiera dane do wyświetlenia, filtrowania albo dalszego przetwarzania.
  • Update zmienia istniejący rekord, na przykład adres dostawy lub stan magazynowy.
  • Delete usuwa dane albo oznacza je jako nieaktywne, gdy stosowane jest tak zwane usuwanie miękkie.

To ważne rozróżnienie. CRUD nie jest nazwą bazy danych, biblioteką ani gotowym narzędziem. To abstrakcyjny model operacji, który można wdrożyć w relacyjnej bazie SQL, bazie dokumentowej, pliku JSON czy usłudze udostępniającej API.

Jak operacje CRUD wyglądają w SQL

W relacyjnych bazach danych operacje CRUD wykonuje się za pomocą poleceń SQL. Ich odpowiedniki są łatwe do zapamiętania, ale trzeba uważać na jedną pułapkę: słowo Create w CRUD dotyczy zwykle dodawania danych, a nie tworzenia tabeli.

Operacja Znaczenie Typowe polecenie SQL
Create Dodanie nowego rekordu INSERT
Read Odczyt jednego lub wielu rekordów SELECT
Update Zmiana istniejących danych UPDATE
Delete Usunięcie rekordów DELETE

Do utworzenia struktury bazy służy natomiast między innymi CREATE TABLE. To polecenie należy do DDL, czyli języka definiowania struktur, a nie do podstawowego zestawu operacji CRUD na rekordach.

Przykładowy zestaw poleceń może wyglądać tak:

INSERT INTO products (name, price, stock)
VALUES ('Klawiatura mechaniczna', 299.00, 15);

SELECT id, name, price, stock
FROM products
WHERE stock > 0
ORDER BY name;

UPDATE products
SET price = 279.00
WHERE id = 1;

DELETE FROM products
WHERE id = 1;

W praktyce szczególnie pilnuję warunku WHERE przy aktualizacji i usuwaniu. Bez niego polecenie może zmienić albo skasować wszystkie rekordy w tabeli, a pomyłka często nie daje się łatwo cofnąć.

CRUD na konkretnym przykładzie sklepu

Załóżmy, że aplikacja przechowuje produkty. Użytkownik panelu administracyjnego może dodać nową pozycję, zobaczyć listę, poprawić cenę i usunąć produkt. Każdy z tych ekranów odpowiada innej operacji, choć dla użytkownika wszystko wygląda po prostu jak obsługa katalogu.

Create oznacza dodanie rekordu

Formularz z nazwą, ceną i liczbą sztuk trafia do aplikacji, a ta wykonuje polecenie INSERT. Baza powinna dodatkowo sprawdzić typy danych, wartości wymagane oraz ograniczenia, takie jak unikalność kodu produktu.

INSERT INTO products (name, price, stock)
VALUES ('Mysz bezprzewodowa', 89.90, 42);

Samo wysłanie formularza nie wystarczy. Dobra aplikacja sprawdza również, czy cena nie jest ujemna, nazwa nie jest pusta, a użytkownik ma prawo tworzyć produkty. Walidacja powinna działać przed zapisem, ale ograniczenia w bazie są dodatkową warstwą ochrony.

Read pobiera dane do prezentacji

Operacja odczytu korzysta z SELECT. Może zwrócić wszystkie produkty, pojedynczy rekord wskazany przez identyfikator albo wynik wyszukiwania ograniczony filtrami.

SELECT id, name, price
FROM products
WHERE name LIKE '%mysz%'
ORDER BY price ASC;

Przy większych tabelach nie pobieram bez potrzeby wszystkich kolumn i rekordów. Filtrowanie, sortowanie i paginacja, czyli dzielenie wyników na strony, ograniczają obciążenie bazy i przyspieszają działanie interfejsu.

Update zmienia istniejące dane

Zmiana ceny lub stanu magazynowego wymaga polecenia UPDATE. Identyfikator rekordu powinien być jednoznaczny, a zakres zmiany dokładnie określony.

UPDATE products
SET price = 79.90, stock = 50
WHERE id = 2;

Dobrym zwyczajem jest sprawdzenie liczby zmodyfikowanych wierszy. Jeśli aplikacja spodziewała się jednego rekordu, a baza zmieniła ich 500, oznacza to błąd w warunku lub logice programu.

Przeczytaj również: Agregacja SQL - GROUP BY, HAVING, funkcje okienkowe. Jak to działa?

Delete nie zawsze oznacza fizyczne usunięcie

Najprostsze usuwanie wygląda tak:

DELETE FROM products
WHERE id = 2;

W wielu systemach lepszym rozwiązaniem jest jednak soft delete. Zamiast kasować rekord, ustawiamy na przykład deleted_at albo is_active = 0. Dzięki temu historia zamówień, raporty i informacje audytowe nadal mogą wskazywać produkt, który został wycofany.

Jak CRUD łączy się z REST API i Pythonem

CRUD opisuje operacje na danych, natomiast REST API opisuje sposób udostępniania zasobów przez sieć. W typowej aplikacji Python żądanie HTTP trafia do widoku lub kontrolera, ten sprawdza dane i uprawnienia, a warstwa dostępu do danych wykonuje zapytanie SQL albo korzysta z ORM.

Operacja CRUD Metoda HTTP Przykładowy endpoint
Create POST /products
Read GET /products lub /products/2
Update PUT lub PATCH /products/2
Delete DELETE /products/2

To mapowanie jest popularne, ale nie jest sztywnym prawem. PUT zwykle zastępuje cały zasób, a PATCH zmienia tylko wybrane pola. Z kolei endpoint może wykonywać bardziej złożoną logikę biznesową, dlatego sama nazwa metody HTTP nie gwarantuje poprawnej implementacji CRUD.

W Pythonie można pracować bezpośrednio z modułem sqlite3:

import sqlite3

connection = sqlite3.connect("shop.db")

connection.execute(
    "INSERT INTO products (name, price) VALUES (?, ?)",
    ("Mysz bezprzewodowa", 89.90)
)

connection.commit()
connection.close()

Znaki zapytania są parametrami zapytania i pomagają uniknąć SQL injection, czyli sytuacji, w której złośliwy tekst użytkownika zostaje potraktowany jak fragment SQL. Przy większych projektach wygodę zapewnia ORM, na przykład SQLAlchemy lub Django ORM, ale ORM nie zwalnia z rozumienia SQL. Ukrywa część szczegółów, lecz nie usuwa problemów z wydajnością, uprawnieniami ani błędną logiką.

Najczęstsze błędy przy implementacji CRUD

Prosty zestaw czterech operacji szybko staje się ryzykowny, gdy aplikacja nie kontroluje dostępu i nie przewiduje błędnych danych. W mojej ocenie początkujący najczęściej skupiają się na samym zapytaniu, a zbyt późno zajmują się tym, kto może wykonać daną operację.

  • Brak WHERE przy UPDATE lub DELETE może zmienić albo usunąć całą tabelę.
  • Sklejanie zapytań z tekstem użytkownika otwiera drogę do SQL injection. Należy stosować parametryzowane zapytania.
  • Brak transakcji może zostawić system w połowie wykonanej operacji, szczególnie gdy jedna akcja zmienia kilka tabel.
  • Brak walidacji prowadzi do pustych nazw, błędnych cen, niepoprawnych adresów e-mail i niespójnych danych.
  • Usuwanie bez historii utrudnia audyt i odzyskanie informacji. W takich przypadkach lepsze może być soft delete.
  • Zbyt szeroki dostęp do API pozwala użytkownikowi modyfikować dane, których nie powinien nawet widzieć.

Trzeba też pamiętać, że CRUD nie zastępuje logiki biznesowej. Zmniejszenie stanu magazynowego po zakupie może wyglądać jak zwykły UPDATE, ale w rzeczywistości wymaga sprawdzenia dostępności, ceny, płatności i współbieżności kilku zamówień.

Nie każda tabela potrzebuje pełnego CRUD. Dla dzienników zdarzeń często blokuje się aktualizację i usuwanie, tworząc model typu append-only, w którym dane można dopisywać, ale nie zmieniać. Takie ograniczenie poprawia wiarygodność historii i upraszcza kontrolę zmian.

Jak rozpoznać dobrze zaprojektowany moduł CRUD

Dobry moduł CRUD ma jasne odpowiedzialności. Warstwa interfejsu zbiera dane, API kontroluje format i uprawnienia, logika aplikacji stosuje reguły biznesowe, a warstwa bazy wykonuje bezpieczne operacje na rekordach.

Przed uznaniem funkcji za gotową sprawdzam kilka rzeczy. Czy można dodać poprawny rekord? Czy błędne dane są odrzucane? Czy odczyt nie zwraca poufnych pól? Czy użytkownik nie zmieni cudzego rekordu? Czy usunięcie jest odwracalne albo przynajmniej rejestrowane?

Pomocne są również testy obejmujące każdą z czterech operacji oraz przypadki brzegowe. Warto przetestować pusty formularz, nieistniejący identyfikator, brak uprawnień, równoczesne modyfikacje i próbę wstrzyknięcia kodu SQL.

Od czterech operacji do bezpiecznej aplikacji

Najkrótsza odpowiedź na pytanie, co to jest CRUD, brzmi: to model czterech podstawowych działań na danych, czyli tworzenia, odczytu, aktualizacji i usuwania. W SQL odpowiadają im przede wszystkim INSERT, SELECT, UPDATE i DELETE, a w API często metody POST, GET, PUT lub PATCH oraz DELETE.

Same polecenia są proste. Trudniejsza część zaczyna się przy walidacji, transakcjach, uprawnieniach, historii zmian i ochronie przed błędami. To właśnie te elementy decydują, czy CRUD będzie tylko działającym formularzem, czy solidną podstawą aplikacji tworzonej w Pythonie i innych technologiach.

FAQ - Najczęstsze pytania

Create realizuje zwykle polecenie INSERT, Read polecenie SELECT, Update polecenie UPDATE, a Delete polecenie DELETE. CREATE TABLE nie dodaje rekordu, lecz tworzy strukturę tabeli i należy do DDL.

Bez WHERE polecenie może zmienić albo usunąć wszystkie rekordy w tabeli. Warto również sprawdzać liczbę zmodyfikowanych wierszy, aby wykryć sytuację, w której zamiast jednego rekordu zmieniono ich setki.

Create często odpowiada metodzie POST, Read metodzie GET, Update metodzie PUT lub PATCH, a Delete metodzie DELETE. W Pythonie żądanie może trafić do kontrolera, który sprawdza dane i uprawnienia, a następnie wykonuje SQL lub korzysta z ORM.

Soft delete sprawdza się, gdy historia zamówień, raporty lub audyt powinny nadal wskazywać wycofany rekord. Zamiast usuwać dane poleceniem DELETE, aplikacja ustawia na przykład deleted_at albo is_active = 0.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi

crud
rest api
orm
sql injection
usuwanie miękkie
Autor Jeremi Andrzejewski
Jeremi Andrzejewski
Nazywam się Jeremi Andrzejewski i od 13 lat zajmuję się programowaniem, w szczególności w języku Python oraz nowoczesnymi technologiami. Moje zainteresowanie tymi tematami zaczęło się od pierwszych projektów, które realizowałem w szkole, a z czasem przerodziło się w pasję do rozwiązywania problemów i tworzenia innowacyjnych rozwiązań. Lubię dzielić się swoją wiedzą, szczególnie w zakresie analizy danych, automatyzacji procesów oraz tworzenia aplikacji webowych. W swojej pracy koncentruję się na dostarczaniu użytecznych, klarownych i aktualnych informacji. Staram się zawsze sprawdzać źródła, porównywać dostępne informacje i upraszczać skomplikowane zagadnienia, aby były zrozumiałe dla każdego. Wierzę, że odpowiednie zorganizowanie wiedzy oraz śledzenie najnowszych trendów w branży są kluczowe dla efektywnego nauczania i rozwoju. Cieszę się, że mogę dzielić się swoimi doświadczeniami na akademiapython.pl, gdzie mam nadzieję inspirować innych do odkrywania fascynującego świata programowania.

Udostępnij artykuł

Napisz komentarz