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ę
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
done INTEGER NOT NULL DEFAULT 0
);
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
| Akcja | SQL | Co robi |
|---|---|---|
| Create | INSERT | Dodaj nową linię |
| Read | SELECT | Przeczytaj jedną lub więcej linijek |
| Update | UPDATE | Edytuj istniejący wiersz |
| Delete | DELETE | Usuń wiersz |
INSERT INTO tasks (title) VALUES ('Купить хлеб');
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 tasks SET done = 1 WHERE id = 1;
DELETE FROM tasks WHERE id = 1;
SQL Python: modułu sqlite3
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)
? 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.