SQLite
SQLite – otwartoźródłowy, lekki system zarządzania relacyjną bazą danych (RDBMS), który działa w trybie embedded oraz jako biblioteka C dostarczana w formie jednego pliku. W odróżnieniu od tradycyjnych serwerów baz danych, SQLite nie wymaga osobnego procesu serwera – wszystkie operacje są wykonywane w ramach aplikacji, która korzysta z biblioteki.
Historia
Projekt rozpoczął się w 2000 roku pod nazwą SQLite (skrót od Structured Query Language Light). Autorzy, D. Richard Hipp i jego zespół z Hipp, Inc., stworzyli go jako alternatywę dla większych systemów bazodanowych w aplikacjach o ograniczonych zasobach. Pierwsza publiczna wersja została wydana w 2000 roku, a od tego czasu biblioteka jest rozwijana i utrzymywana w modelu open source pod licencją Public Domain.
Architektura i cechy
- Jednoplikowy format – cała baza danych (schemat, dane i indeksy) znajduje się w jednym pliku, co upraszcza przenoszenie i kopiowanie.
- Brak serwera – wszystkie operacje są wykonywane w procesie klienckim, co eliminuje konieczność konfiguracji i zarządzania serwerem.
- Transakcje ACID – SQLite zapewnia pełną zgodność z zasadami ACID, w tym atomiczność, spójność, izolację i trwałość.
- Wsparcie dla SQL – implementuje podzbiór standardu SQL‑92 oraz rozszerzenia specyficzne dla SQLite (np. typy
INTEGER PRIMARY KEY AUTOINCREMENT). - Obsługa wielu języków – dostępne wiązania (bindings) dla Python, Java, C#, PHP, Ruby i wielu innych.
- Rozmiar – biblioteka mieści się w kilkudziesięciu kilobajtach, a minimalny rozmiar bazy to 512 KB.
- Wydajność – zoptymalizowane algorytmy indeksowania (B‑tree), pamięć podręczna oraz tryb write‑ahead logging (WAL) zapewniają wysoką wydajność przy małych i średnich zbiorach danych.
Główne komponenty
- Silnik SQL (parser)
- Odpowiada za analizę, optymalizację i wykonanie zapytań w języku SQL.
- Magazyn danych (B‑tree)
- Przechowuje tabele i indeksy w formacie drzewiastym, zapewniając szybkie wyszukiwanie.
- Mechanizm transakcyjny
- Wykorzystuje plik
journallub tryb WAL do zapewnienia trwałości i izolacji. - Interfejs API (C)
- Udostępnia zestaw funkcji (
sqlite3_open,sqlite3_prepare_v2,sqlite3_stepitp.) używanych przez aplikacje.
Przykładowe zastosowania
SQLite jest wykorzystywany w szerokim zakresie produktów, m.in.:
- Systemy operacyjne mobilne – Android, iOS.
- Przeglądarki internetowe – Firefox, Chrome.
- Oprogramowanie biurowe – LibreOffice, Thunderbird.
- Gry i aplikacje multimedialne – wiele silników gier korzysta z SQLite do przechowywania konfiguracji i statystyk.
- Urządzenia IoT – dzięki małemu rozmiarowi i niskim wymaganiom zasobowym.
Kompatybilność i wersje
Pierwsza wersja stabilna (1.0) pojawiła się w 2000 roku. Od tego czasu wydawane są główne wersje:
| Wersja | Rok wydania | Kluczowe zmiany |
|---|---|---|
| 1.0 | 2000 | Podstawowa implementacja SQL, jednoplikowy format. |
| 2.0 | 2004 | Dodano wsparcie dla transakcji WAL. |
| 3.0 | 2004 | Wprowadzenie obsługi typów BOOLEAN i DATETIME. |
| 3.8 | 2013 | Usprawnienia wydajności i nowe funkcje wyrażeń regularnych. |
| 3.25 | 2018 | Wsparcie dla okienkowych funkcji analitycznych. |
| 3.39 | 2022 | Rozszerzenia JSON, lepsza integracja z Rust. |
Aktualna stabilna wersja (stan na 2024 r.) to 3.46.0.
Licencja i rozwój
SQLite jest udostępniany na zasadach Public Domain, co oznacza, że można go używać, modyfikować i rozpowszechniać bez ograniczeń prawnych. Projekt jest rozwijany na publicznej liście mailingowej sqlite-dev i przyjmuje wkład od społeczności oraz firm komercyjnych.
Porównanie z innymi systemami bazodanowymi
| Cecha | SQLite | MySQL | PostgreSQL |
|---|---|---|---|
| Model | Embedded | Klient‑serwer | Klient‑serwer |
| Rozmiar binarny | ≈ 500 KB | ≈ 20 MB | ≈ 30 MB |
| Wymagania sprzętowe | Niskie | Średnie‑wysokie | Średnie‑wysokie |
| Obsługa replikacji | Brak | Tak | Tak |
| Transakcje | ACID (WAL) | ACID (InnoDB) | ACID (MVCC) |
Przykład użycia w języku Python
import sqlite3
# otwarcie bazy (tworzy plik jeśli nie istnieje)
conn = sqlite3.connect('przyklad.db')
cursor = conn.cursor()
# utworzenie tabeli
cursor.execute('''
CREATE TABLE IF NOT EXISTS osoby (
id INTEGER PRIMARY KEY AUTOINCREMENT,
imie TEXT NOT NULL,
nazwisko TEXT NOT NULL,
wiek INTEGER
)
''')
# wstawienie danych
cursor.execute('INSERT INTO osoby (imie, nazwisko, wiek) VALUES (?, ?, ?)',
('Anna', 'Kowalska', 28))
# zapytanie
cursor.execute('SELECT * FROM osoby')
print(cursor.fetchall())
# zamknięcie połączenia
conn.commit()
conn.close()
Wady i ograniczenia
- Brak natywnego wsparcia dla replikacji i klastrów – nie nadaje się do bardzo dużych, rozproszonych systemów.
- Ograniczona skalowalność przy bardzo wysokim obciążeniu zapisu (kilkaset tysięcy operacji na sekundę wymaga dodatkowych technik, np. partycjonowania).
- Nie obsługuje pełnego zestawu typów SQL‑99 (np. typów
ARRAY).
Podsumowanie
SQLite jest najpopularniejszym systemem bazodanowym typu embedded na świecie – szacuje się, że jest używany w setkach milionów aplikacji, a jego kod źródłowy jest wdrożony w miliardach urządzeń. Dzięki prostocie integracji, niewielkim wymaganiom oraz otwartemu licencjonowaniu, pozostaje kluczowym narzędziem w ekosystemie programistycznym, zarówno w projektach hobby, jak i w komercyjnych produktach klasy enterprise.