Rozdział 22 · Tworzenie stron internetowych z Python

SQL: tworzymy, czytamy i edytujemy dane

Jeden język – stwórz tabelę, przeczytaj ją, zmodyfikuj i usuń dane.

SQL (Structured Query Language — język zapytań strukturalnych) — język definiowania struktury danych i wykonywania zapytań do relacyjnej bazy danych: za pomocą niego tworzą tabele, czytają, dodają, modyfikują i usuwają wiersze. SQL ma wspólny standard, ale każda konkretna system (SQLite, PostgreSQL, MySQL) — ma swoje rozszerzenia i cechy na jego bazie, dlatego mówi się nie o „różnych językach SQL”, lecz o różnych dialektach jednym języku. Przykłady na tej stronie przedstawiono w SQLite (Rozdział 22.23).

CREATE TABLE — opisujący strukturę

sozdanie_tablicy.sql
CREATE TABLE tasks (
    id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    done INTEGER NOT NULL DEFAULT 0
);
NOT NULL zabrania wartości NULL, a nie pustego łańcuch znaków
NOT NULL uniemożliwia zapisanie specjalnej wartości SQL-owej do kolumny NULL („wartość nieznana/brakująca” '' nadal jest ważną wartością typu TEXT, oraz NOT NULL nie odrzuci jej. Jeśli aplikacja musi zabronić właśnie pustego (lub składającego się ze spacji) nagłówka zadania, potrzebne jest oddzielne sprawdzenie — po stronie aplikacji (rozdział 22.31) lub wyraźne ograniczenie CHECK, jak pokazano w sekcji 22.29.

DEFAULT 0 ustawia wartość domyślną, jeśli nie podano jej jawnie.

Cztery operacje CRUD

AkcjaSQLCo robi
CreateINSERTDodaj nową linię
ReadSELECTPrzeczytaj jedną lub więcej linijek
UpdateUPDATEEdytuj istniejący wiersz
DeleteDELETEUsuń wiersz
insert.sql
INSERT INTO tasks (title) VALUES ('Купить хлеб');
select.sql
SELECT id, title, done FROM tasks WHERE done = 0 ORDER BY id LIMIT 10;

WHERE zostawia tylko odpowiednie linie, ORDER BY ustala kolejność, LIMIT ogranicza liczbę wyników.

update.sql
UPDATE tasks SET done = 1 WHERE id = 1;
delete.sql
DELETE FROM tasks WHERE id = 1;

SQL Python: modułu sqlite3

sql_iz_python.py
import sqlite3

baza = sqlite3.connect("zadachi.db")
baza.execute(
    "INSERT INTO tasks (title) VALUES (?)",
    („Kup chleb”,),
)
baza.commit()

stroki = baza.execute("SELECT id, title, done FROM tasks").fetchall()
for stroka in stroki:
    print(stroka)
znak zapytania zamiast f-strings nie jest wyborem stylistycznym
? w SQL-string to parametryzowane zapytanie: wartość jest podstawiona przez sam moduł sqlite3bezpiecznie oddzielone od tekstu prośby. Jeśli zamiast tego zapytanie zostanie złożone za pomocą łańcuch znaków f- z wejściem użytkownika w środku, otwiera to drogę do wstrzyknięcia SQL-injection – co dokładnie może pójść nie tak i dlaczego parametryzacja jest obowiązkowa, a nie pożądana, pokazuje sekcja 22.32.
Praktyka: CRUD na SQLite
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →