SQLite

SQLite e' il database relazionale piu' installato nel mondo! SQLite e' molto semplice e la sua libreria puo' essere facilmente inclusa nei programmi che lo richiedono e cosi' avviene in milioni di casi. SQLite fornisce una base dati transazionale, acceduta tramite SQL e non richiede alcuna attivita' di amministrazione o di gestione. Le sue funzionalita' sono in parte limitate, ma per alcuni tipi di utilizzo e' SQLite la scelta ottimale.

SQLite e' rilasciato come software in Public Domain, quindi utilizzabile nel modo piu' ampio e senza alcuna limitazione.
Questo documento e' stato preparato con la versione 3.7 di SQLite ma e', mutatis mutandis, valido anche per le altre versioni.

Ho fretta!

# apt-get install sqlite3 # yum se utilizzate Red Hat, CentOS, ... # sqlite3 test.db SQLite version 3.7.3 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table emp (empno number, ename char(10)); sqlite> .tables emp sqlite> insert into emp values(10,'SMITH'); sqlite> ^D # sqlite3 test.db "select * from emp" 10|SMITH # ls -l test.db -rw-r----- 1 root root 2048 2010-09-31 14:69 test.db # file test.db test.db: SQLite 3.x database # od -c test.db 0000000 S Q L i t e f o r m a t 3 \0 ... # wget http://sourceforge.net/projects/sqlitebrowser/files/sqlitebrowser/2.0%20beta1/sqlitebrowser_200_b1_src.tar.gz/download

Se vi e' bastato quanto sopra per capire tutto quello che vi serve potete passare agli esempi, altrimenti continuate a leggere...

Diffusione

SQLite e' un database relazionale, la sua sintassi SQL e' molto completa e standard, la sua qualita' e' elevatassima, e' disponibile praticamente su tutte le piattaforme, includere SQLite in un programma e' semplice e richiede poco codice, l'utilizzo e' completamente gratuito e libero, ... Non deve stupire che SQLite sia molto diffuso!

Includono un database SQLite tutte le installazioni di Firefox, di Skype, i web server con il PHP, i sistemi Solaris 10, i MAC, ... Ma anche tutti gli iPhone, gli smartphone Android, i piu' recenti cellulari con Symbian, molti altri modelli di cellulari, i piu' evoluti modelli di lettori MP3 e moltissimi apparati elettronici, ...
Facendo le somme gli sviluppatori di SQLite ritengono che il numero di installazioni superi i 500 milioni: un numero di gran lunga superiore a qualsiasi altro database!

Installazione

Se SQLite e' utilizzato in un programma allora non e' necessaria alcuna installazione. Ma se invece volte utilizzarlo direttamente da linea di comando e' necessario installarlo.

Se avete un sistema Linux facilmente SQLite e' gia' presente. Comunque l'installazione con yum o apt-get e' semplicissima! Ad esempio:

yum install sqlite3

Fatto!
E' stata installata la libreria di SQLite ed il programma sqlite3 per l'utilizzo interattivo. Non serve altro...

Utilizzo del client

Tipicamente SQLite e' utilizzato da programmi che lo richiamano per memorizzare i propri dati su una base dati relazionale. A volte pero' e' utile utilizzare il client per controllare da linea di comando il contenuto di una base dati. L'utilizzo del client sqlite3, come visto nell'esempio iniziale, e' banale e richiede solo una conoscenza basilare dell'SQL. Oltre ai comandi standard SQL, terminati sempre con un punto e virgola, vi sono alcuni comandi specifici di sqlite3 identificati da un punto iniziale. Ecco i piu' utilizzati:

.bail ON|OFF           Interrompe a fronte di un errore
.databases             Mostra le informazioni sul database
.echo ON|OFF           Visualizzazione comandi
.exit                  Termina il programma
.header ON|OFF         Visualizzazione nomi colonne
.help                  Help
.output FILENAME       Invia l'output su FILENAME
.quit                  Termina il programma
.schema ?TABLE?        Mostra la struttura della tabella (o di tutte)
.tables ?PATTERN?      Elenca le tabelle che contengono il PATTERN (o tutte)

L'SQL utilizzato da SQLite e' simile all'SQL di altri RDBMS, sul sito ufficiale si trova l'elenco completo dei comandi SQL. Nella select sono molto comode le subquery e le clausole di LIMIT ed OFFSET. Ecco un esempio:

SELECT dept.location, count(*), sum(salary) from emp, dept where emp.deptno=dept.deptno group by dept.location order by 3 desc limit 10 offset 0;

Qualche esempio di query, utilizzando i database dei piu' diffusi programmi che sfruttano SQLite, si trova in questo documento...
Oltre ai comandi SQL e' possibile definire alcuni parametri interni mediante il comando pragma (eg. pragma auto_vacuum=1), ma e' veramente raro doverlo utilizzare.

Se si vuole utilizzare un'interfaccia grafica sono disponibili molti client tra cui un ottimo SQLite Database Browser (download) ed il Plug-in Firefox SQLite Manager.

SQLite Manager

Architettura

SQLite fornisce una base dati SQL utilizzabile dalle applicazioni.

SQLite e' semplicemente una libreria. I sorgenti si scaricano dal sito ufficiale. Si tratta principalmente di un file in linguaggio C di 130K righe che puo' essere compilato con i semplici passi configure e make. Il risultato della compilazione e' il client sqlite3 ed una libreria.
Basta includere la libreria nel link ed un qualsiasi programma puo' utilizzare le funzioni di SQLite (sono presenti le API per principali linguaggi di programmazione). La libreria richiede pochi KB. E' tuttavia possibile diminuirne ulteriormente la dimensione ed ottimizzarlo si dispositivi con limitate caratteristiche HW.
E' disponibile un comando (sqlite3 o sqlite3.exe) che consente di lanciare interattivamente i comandi SQL.
SQLite non utilizza alcun processo, thread, segmento di memoria, ...
La struttura dati e' costituita da un solo file. Il file ha un formato fisso ed e' identico su tutte le piattaforme (eg. Big/Little Endian, 32/64 bit). Il database puo' essere spostato tra sistemi diversi con una semplice copia. Naturalmente possono essere utilizzati piu' file, ma ciascuno sara' un DB diverso... ad esempio non potranno essere messe in join tabelle provenienti da DB diversi.

Processi/programmi diversi possono accedere allo stesso DB. Il lock in scrittura e' a livello del file, quindi dell'intero DB. Quando un programma/processo effettua una modifica nessun altro puo' leggere i dati. SQLite e' molto robusto e soddisfa le caratteristiche ACID.
Il dizionario dati e' costituito da una sola tabella: sqlite_master. Con una semplice select si possono determinare tutti gli oggetti presenti nel DB: tabelle, indici, viste, ...

I dati vengono memorizzati su 5 differenti storage class:

Tutti i datatype di SQLite sono una specializzazione delle storage class appenda descritte. Non esiste una storage class per le date che vengono memorizzate come testo (eg. formato ISO8601: YYYY-MM-DD HH:MM:SS.SSS) o come numerico (eg. secondi da Epoch).
Qualche dettaglio sugli internals: un database SQLite e' composto da pagine della stessa dimensione e con un header ben documentato; gli indici utilizzano la tecnica dei B-tree; la gestione delle pagine libere e' mantenuta in una freelist; il recupero dello spazio libero e' effettuato con il vacuum. La gestione delle transazioni e' effettuata con un rollback journal o, dalla versione 3.7, con un write-ahead log (WAL) in alternativa.

SQLite e' SQL standard ANSI 92, con poche limitazioni e differenze rispetto allo standard. Le differenze sono dovute soprattutto all'utilizzo di SQLite che e' prevalentemente effettuato da programmi che lo includono in modalita' embedded. Rispetto a quanto previsto dallo standard non esistono gli statement di GRANT/REVOKE. La gestione della sicurezza e' infatti basata sui permessi del file che contiene il DB. Se il file di database e' leggibile si puo' eseguire qualunque query, se il file e' scrivibile si puo' effettuare anche qualunque operazione di DML (modifica).
In SQLite non sono implementate Stored Procedure (ma sono opzionali per l'SQL ANSI 92).

Dall'architettura dovrebbero essere ben chiari i limiti e le caratteristiche di SQLite... In nessun modo SQLite e' un'alternativa ad Oracle, a PostgreSQL, a MySQL, ... Le funzionalita' di un database Enterprise in termini di gestione della concorrenza, dell'accesso in client/server, ... non hanno un corrispondente in SQLite. Pero' nel caso di un programma che necessita gestire i propri dati, SQLite offre molti vantaggi rispetto alla semplice memorizzazione su file.

Un esempio in C

Ecco un semplice programma di esempio in C (lanciare con sqlitetest db comando):

#include <stdio.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **Col){
  int i;
  for(i=0; i<argc; i++){ printf("%s = %s\n", Col[i], argv[i] ? argv[i] : "NULL"); }
  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *Err = 0;

  sqlite3_open(argv[1], &db);
  sqlite3_exec(db, argv[2], callback, 0, &Err);
  sqlite3_close(db);
  return 0;
}
Il programma e' ridotto poiche' non gestisce il controllo dei parametri, gli errori... Ma e' comunque indicativo, i passi sono: apri il DB, lancia uno statement SQL, chiudi. E questo e' sufficiente anche nel caso, piu' complesso, di una SELECT che richiede un callback per la gestione dinamica dei risultati.
Quindi bastano poche righe in C per includere un database relazionale nella propria applicazione. E' quello che hanno fatto Firefox, Chrome, Thunderbird, Skype, iPhone, Android, MAC OS X, Solaris 10, ... e moltissimi altri programmi.

Varie ed eventuali

Vuoi leggere altro sullo stesso argomento?
Sul documento Sotto il programma... SQLite! trovi come e' stato utilizzato SQLite in alcuni dei piu' diffusi programmi al mondo. Mentre su Anatomia di SQLite trovi una descrizione piu' completa dell'architettura di SQLite (l'unica scritta in italiano che io sappia).
Naturalmente la documentazione completa si trova sul sito ufficiale SQLite.


Titolo: SQLite
Livello: Medio (2/5)
Data: 1 Novembre 2011
Versione: 1.0.5 - 1 Giugno 2012
Autore: mail [AT] meo.bogliolo.name