encyklopedia.space

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 journal lub tryb WAL do zapewnienia trwałości i izolacji.
Interfejs API (C)
Udostępnia zestaw funkcji (sqlite3_open, sqlite3_prepare_v2, sqlite3_step itp.) 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:

WersjaRok wydaniaKluczowe zmiany
1.02000Podstawowa implementacja SQL, jednoplikowy format.
2.02004Dodano wsparcie dla transakcji WAL.
3.02004Wprowadzenie obsługi typów BOOLEAN i DATETIME.
3.82013Usprawnienia wydajności i nowe funkcje wyrażeń regularnych.
3.252018Wsparcie dla okienkowych funkcji analitycznych.
3.392022Rozszerzenia 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

CechaSQLiteMySQLPostgreSQL
ModelEmbeddedKlient‑serwerKlient‑serwer
Rozmiar binarny≈ 500 KB≈ 20 MB≈ 30 MB
Wymagania sprzętoweNiskieŚrednie‑wysokieŚrednie‑wysokie
Obsługa replikacjiBrakTakTak
TransakcjeACID (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.