SQLite

Lekka, bezserwerowa baza relacyjna przechowywana w jednym pliku. Popularna w aplikacjach mobilnych i wbudowanych.

SQLite to lekka, bezserwerowa baza danych relacyjna, która całą swoją zawartość — tabele, indeksy, schemat i dane — trzyma w jednym pliku na dysku. Nie ma osobnego procesu serwera, do którego trzeba się łączyć przez gniazdo czy port. Twoja aplikacja dołącza bibliotekę SQLite jako kod i czyta plik bezpoścznio. To dlatego nazywa się ją embedded (wbudowaną): baza żyje wewnątrz programu, a nie obok niego.

Jak to działa i do czego się nadaje

Zamiast stawiać serwer typu PostgreSQL czy MySQL, dodajesz do projektu jedną bibliotekę (np. libsqlite3) i wskazujesz plik, na przykład baza.db. Cała komunikacja to wywołania funkcji w obrębie Twojego procesu — żadnej sieci, żadnej konfiguracji użytkowników, portów ani haseł. SQLite obsługuje większość standardu SQL, transakcje ACID i działa praktycznie wszędzie: na Androidzie, iOS, w przeglądarkach, routerach, samochodach i samolotach. To prawdopodobnie najczęściej wdrożona baza danych na świecie — siedzi w miliardach urządzeń.

Jest świetna tam, gdzie potrzebujesz lokalnego, niezawodnego magazynu danych: ustawienia aplikacji mobilnej, cache, dane offline, prototypy, testy, małe i średnie strony WWW oraz pliki będące właściwie formatem dokumentu (SQLite bywa traktowany jak alternatywa dla fopen()).

Przykład z praktyki

Załóżmy, że masz narzędzie CLI w Pythonie i chcesz zapisać kilka rekordów. Nie instalujesz nic poza standardową biblioteką — moduł sqlite3 jest w niej domyślnie:

import sqlite3; con = sqlite3.connect("dane.db"); con.execute("CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT)"); con.commit()

Z terminala szybki podgląd zrobisz komendą sqlite3 dane.db ".tables", a strukturę tabeli sprawdzisz przez .schema users. Plik możesz skopiować, podejrzeć w przeglądarce DB Browser for SQLite albo wrzucić do repo na potrzeby testów.

Na co uważać

Najczęstszy mit: „SQLite nie nadaje się do produkcji”. Nadaje się — pod warunkiem, że pasuje do scenariusza. Słabo znosi natomiast dużą liczbę równoczesnych zapisów: domyślnie zapis blokuje całą bazę (tryb WAL sporo tu pomaga, ale nie czyni z niej serwera). Druga pułapka to typowanie — SQLite używa dynamicznego systemu typów (type affinity), więc bez włączonej opcji STRICT wrzucisz tekst do kolumny INTEGER i baza nie pisnie. Pamiętaj też o włączeniu obsługi kluczy obcych przez PRAGMA foreign_keys = ON, bo domyślnie bywa wyłączona. I nie trzymaj pliku .db na zdalnym dysku sieciowym — blokady plików się tam sypią.

Pojęcia powiązane: RDBMS, SQL, ACID, transakcje, PostgreSQL, MySQL, ORM, baza embedded, tryb WAL.