SQLite

SQLite

informație
Dezvoltat de D. Richard Hipp
Prima versiune August 2000
Ultima versiune 3.36.0 (18 iunie 2021)
Depozit www.sqlite.org/src
Scris in VS
Sistem de operare Multiplatform
Citiți formatele Format fișier bază de date SQLite ( d ) , bază de date SQLite 3.x ( d ) și jurnal SQLb rollbak ( d )
Formate scrise Format fișier bază de date SQLite ( d ) , bază de date SQLite 3.x ( d ) , bază de date comprimată SQLite Zipvfs ( d ) și jurnal SQLb rollbak ( d )
Tip Sistem de gestionare a bazelor de date la bord ( d )
Licență Domeniu public
Site-ul web sqlite.org

SQLite (pronunțat [ ɛs.ky.ɛl.ajt ]) este o bibliotecă scrisă în limbajul C care oferă motor delimbaj SQL accesibil bazei de date relaționale . SQLite implementează în mare măsură standardul SQL-92 și proprietățile ACID .

Spre deosebire de serverele de baze de date tradiționale, cum ar fi MySQL sau PostgreSQL , particularitatea sa nu este de a reproduce schema obișnuită client-server , ci de a fi direct integrat în programe . Întreaga bază de date (declarații, tabele, index și date) este stocată într-un fișier independent de platformă .

D. Richard Hipp , creatorul SQLite, a ales să plaseze această bibliotecă și codul său sursă în domeniul public , ceea ce permite utilizarea sa nerestricționată atât în proiecte open source cât și în proiecte proprietare . Creatorul și unii dintre principalii dezvoltatori ai SQLite sunt angajați de compania americană Hwaci .

SQLite este cel mai utilizat motor de baze de date din lume, datorită utilizării sale:

Datorită ușurinței sale extreme (mai puțin de 600 KiB ), este, de asemenea, foarte popular pe sistemele încorporate , în special pe majoritatea smartphone-urilor și tabletelor moderne: sistemele de operare mobile iOS , Android și Symbian îl folosesc ca bază de date. În total, putem număra mai mult de un miliard de exemplare cunoscute și raportate ale bibliotecii.

Istoric

D. Richard Hipp și un coleg au început să proiecteze SQLite la începutul anului 2000 în timp ce lucrau la General Dynamics , apoi sub contract cu Marina SUA . SQLite urma să fie utilizat în rachetele ghidate , pentru a înlocui bazele de date IBM Informix care rulează pe mașinile HP-UX . Obiectivul principal era să poți face fără nicio instalare sau administrare: instalarea sau actualizarea bazei de date ar putea dura o zi întreagă.

În august 2000, a fost lansată prima versiune a SQLite. Ea a fost folosind GDBM ( GNU Database Manager) pentru a manipula copaci B .

SQLite 2.0 elimină dependența de gdbm și adaugă suport pentru tranzacții.

SQLite 3.0, produs cu ajutorul AOL , a fost lansat în 2004 și adaugă, printre altele, regionalizarea (cu colaționare și suport Unicode ) și declarația de tip.

Caracteristici

Baza de date încorporată

SQLite Architecture French.svg

Majoritatea sistemelor de gestionare a bazelor de date sunt construite în conformitate cu paradigma client-server , adică o bibliotecă software client este integrată și utilizată în una sau mai multe aplicații în timp ce motorul bazei de date rulează .în propriul spațiu de execuție, sau chiar pe o altă mașină, ca departament IT .

SQLite, dimpotrivă, este direct integrat în aplicația care folosește biblioteca sa software, cu motorul său de baze de date. Accesul la o bază de date cu SQLite se face prin deschiderea fișierului corespunzător: fiecare bază de date este salvată într-un fișier care îi este specific, cu declarațiile sale, tabelele și indexurile sale, dar și datele sale.

Această caracteristică face SQLite interesant ca alternativă la fișierele text, utilizat ca mijloc de stocare integrată în multe aplicații ( parametri , istoric , cache ...), deoarece face accesul la date mai rapid, mai sigur, mai structurat, mai ușor și complet independent de platformă , fără a afecta însă ușurința implementării aplicației care o folosește.

Eliminarea intermediarului între aplicație și date reduce, de asemenea, ușor latența accesului la date comparativ cu sistemele care utilizează paradigma client-server.

Cu toate acestea, această arhitectură pune mai multe probleme:

Nu există nici o anumită extensie pentru fișierele bazei de date SQLite, dar este comun pentru extensii întâlni , cum ar fi .sqlite sau .db , uneori , urmat de numărul versiunii bibliotecii ( .sqlite3 , .db2 , etc). Este posibil să se utilizeze o bază de date salvate numai în memoria RAM , fără a crea fișier de baze de date de pe disc, prin numele de fișier special : memorie: .

În general, este recomandabil să utilizați SQLite acolo unde datele nu sunt centralizate și unde extinderea dimensiunii bazei de date nu este probabil să devină critică. Dacă scopul bazei de date este de a centraliza o masă mare de date și de a le furniza unui număr mare de clienți, este de preferat să utilizați SGBD bazate pe paradigma client-server. SQLite este destinat să înlocuiască fișierele text, nu serverele tradiționale de baze de date.

Compilator și mașină virtuală

SQLite Internal Architecture French.svg

Când o interogare SQL este transmisă către SQLite prin interfața de programare , aceasta este compilată înainte de a fi executată.

Secvențialul compilatorului împarte comenzile date în părți care pot fi procesate separat (o interogare și subinterogarea sa de exemplu), care sunt transmise analizatorului care se ocupă de împărțirea interogărilor în diferite obiecte care reprezintă diferitele ordine. Și clauze ale limbajului SQL. Aceste obiecte sunt transmise generatorului de cod care creează un cod intermediar de nivel scăzut, sau bytecode .

Codul rezultat este un set de instrucțiuni (137 instrucțiuni diferite) numite OpCodes . Acest lucru este lansat în mașina virtuală SQLite, care le vede ca fiind programe mici care descriu operațiile de căutare, citire și modificare a datelor.

Când interpretii mașinii virtuale aceste instrucțiuni, ea a numit managerul de B-arbore bazat pe straturi de nivel care reduce ascunde paginile de disc și stratul de abstractizare hardware - ului .

Gestionarea drepturilor

SQLite nu integrează gestionarea drepturilor de acces și modificarea datelor. Gestionarea se face de către sistemul de fișiere al sistemului de operare  : dacă fișierul care conține baza de date nu este înscriibil pentru un utilizator, acesta va putea, de asemenea, să modifice înregistrările și structura de bază a datelor.

Gestionarea drepturilor cu GRANT și REVOKE este, prin urmare, inexistentă, deși acestea fac parte din specificația SQL-92 .

Utilizarea unei baze de date SQLite nu necesită nicio procedură de instalare sau configurare.

Portabilitate

Biblioteca este scrisă în întregime în C-ANSI , versiunea standardizată a limbajului de programare C și nu folosește alte biblioteci, altele decât biblioteca de limbaj standard . Acest lucru face SQLite compilabil fără modificări majore pe toate arhitecturile computerului, oferind un compilator C care respectă standardul ANSI.

Fișierele bazei de date SQLite sunt complet independente de sistemul de operare și de arhitectura pe care sunt utilizate. Același fișier de bază de date poate fi utilizat pe două arhitecturi cu funcționare radical diferită, SQLite asigurând un strat transparent de abstractizare pentru dezvoltator. Fișierele sunt compatibile între ele pentru fiecare versiune majoră a bibliotecii de la versiunea 3.0.0 a SQLite, deci un fișier creat cu versiunea 3.0.0 va putea fi utilizat cu versiunea 3.6.19 și invers, fișiere create între două versiuni majore diferite ( 2.0.0 și 3.0.0 de exemplu) pot fi compatibile (mai ales în compatibilitatea cu versiunile anterioare), dar nu este întotdeauna cazul.

Tipuri de date

SQLite folosește tastarea dinamică pentru conținutul celulei, spre deosebire de aproape toate DBMS-urile care utilizează tastarea statică  : la crearea unui nou tabel în baza de date, este un tip recomandat sau de afinitate, nu forțat, al datelor care trebuie stocate în coloana care este completată și nu un tip care definește modul în care aceasta va fi reprezentată în memorie, această sarcină fiind rezervată celulei în sine. Când datele sunt introduse în baza de date, SQLite va încerca să convertească noile date la tipul recomandat, dar nu va face acest lucru dacă acest lucru nu este posibil.

Există mai multe tipuri de afinitate în SQLite, acestea definind modul în care SQLite va funcționa atunci când introduceți date noi:

Astfel, fiecare tip de afinitate poate accepta orice tip de date, singura excepție este tipul cheie INTEGER PRIMARY KEY , atunci când este aplicat pe o singură coloană, deoarece nu este un tip obișnuit, ci de la un alias la coloana internă la Motor ROWID care corespunde adresei înregistrării, unic peste masă.

Utilizarea tastării dinamice îmbunătățește omogenitatea între datele din baza de date și tipurile de limbaj utilizate pentru interogarea acesteia dacă acesta din urmă este, de asemenea, un limbaj tipizat dinamic (cum ar fi Python , PHP , Perl sau Ruby ) fără a pune probleme reale cu limbi folosind tastarea statică (cum ar fi C / C ++ sau Java ).

Determinarea tipului de afinitate

Pentru a menține compatibilitatea cu alte baze de date relaționale , SQLite convertește automat numele tipurilor declarate în cel mai potrivit tip de afinitate, după cum urmează:

  • toate numele de tip care conțin cuvântul cheie INT vor fi recunoscute ca câmpuri INTEGER . Cu toate acestea, numai declarația INTEGER PRIMARY KEY va fi recunoscută ca un alias al ROWID  ;
  • toate numele de tip care conțin unul dintre următoarele cuvinte cheie: CHAR (include VARCHAR ), CLOB sau TEXT vor fi recunoscute ca câmpuri TEXT  ;
  • toate numele de tip care conțin cuvântul cheie BLOB vor fi recunoscute ca câmpuri cu NIMIC afinitate  ;
  • toate numele de tip care conțin unul dintre următoarele cuvinte cheie: REAL , FLOAT sau DOUBLE vor fi recunoscute ca câmpuri REAL  ;
  • în toate celelalte cazuri sau dacă tipul nu este specificat, va fi utilizată afinitatea NUMERICĂ .

Deși SQLite utilizează tastarea dinamică, reprezentarea în memorie și procesarea datelor necesită utilizarea diferitelor clase de stocare. Acest lucru este valabil doar pentru versiunea 3 și versiunile sale ulterioare, deoarece datele au fost salvate ca șiruri în versiunile anterioare.

Toate datele manipulate de Motorul de baze de date utilizează unul dintre următoarele tipuri:

  • NULL  : datele corespund tipului special NULL , care indică absența informațiilor sau o valoare nedefinită;
  • INTEGER  : datele sunt un număr întreg semnat și acesta este înregistrat, în ordinea mărimii sale, pe 1, 2, 3, 4, 6 sau 8 octeți , dar în memorie, este convertit în 8 octeți (semnat pe 8 octeți întreg);
  • REAL  : datele sunt un număr în virgulă mobilă înregistrat pe 8 octeți conform standardului IEEE  ;
  • TEXT  : datele sunt un șir de caractere, codificat în UTF-8 (implicit), UTF-16-BE sau UTF-16-LE  ;
  • BLOB  : datele sunt înregistrate așa cum au fost date.
Tip NULL

Standardul nu definește exact cum ar trebui tratat tipul NULL .

La fel ca în majoritatea bazelor de date relaționale, toate înregistrările NULL sunt considerate distincte prin constrângerea UNIQUE , dar sunt considerate identice de operatorul UNION și de cuvântul cheie DISTINCT .

Operațiile aritmetice care includ un tip NULL în expresia lor returnează necunoscut (valoare nedefinită). În operațiile booleene , valoarea de returnare ar putea fi NECUNOSCUTĂ dacă apare un tip NULL și rezultatul nu poate fi determinat cu certitudine: NULL SAU 1 va da valoarea 1 , dar NULL SAU 0 va da valoarea NECUNOSCUTĂ deoarece operațiunea nu poate fi rezolvată cu certitudine .

Datele

SQLite nu are un tip care să reprezinte datele. Cu toate acestea, există un set de funcții pentru a le manipula. Stocarea unei date se poate face într-un șir de caractere în forma ISO 8601 sau într-un număr întreg sub forma unui timestamp UNIX .

Constrângeri

SQLite gestionează constrângerile de pe una sau mai multe coloane. Constrângerile NOT NULL , CHECK , DEFAULT și COLLATE sunt declarate pe coloană în timp ce constrângerile PRIMARY KEY , UNIQUE , CHECK și FOREIGN KEY pot fi declarate pe una sau mai multe coloane.

Constrângerea UNIQUE creează automat un index pe coloana (coloanele) căreia i se aplică.

CHEIA PRINCIPALA

Constrângerea cheii primare va crea o constrângere UNICĂ pe coloana (coloanele) afectată (e), însă, spre deosebire de standard , constrângerea PRIMARY KEY a SQLite permite intrări care sunt NULL . Aceasta este o neconformitate cu standardul, iar această abatere ar putea fi rezolvată în versiunile viitoare. Prin urmare, este recomandabil să adăugați constrângerea NOT NULL la declarația unei chei primare.

ROWID și AUTOINCREMENT

Fiecare rând dintr-un tabel este identificat printr-un întreg semnat pe 64 de biți numit ROWID . Când un tabel este declarat cu o singură coloană INTEGER PRIMARY KEY , această coloană devine un alias al ROWID . Utilizarea unui alias cu identificatorul ROWID crește viteza căutărilor, care poate fi de până la două ori mai rapidă decât cu o cheie primară normală asociată cu indicele său de unicitate.

Când tabelul este gol, algoritmul atribuie valoarea 1 identificatorului, pe care îl crește pentru fiecare înregistrare nouă, până când atinge limita unui număr întreg semnat pe 64 de biți ( ). Odată ce această limită este atinsă, va reutiliza spațiile eliberate de înregistrările șterse. Prin urmare, alocarea identificatorilor nu mai este incrementală, ci aleatorie.

Este posibil să utilizați cuvântul cheie AUTOINCREMENT . Acesta din urmă modifică ușor algoritmul: odată atinsă limita unui număr întreg, nu va mai fi posibilă inserarea unei noi înregistrări. Acest lucru face posibilă garantarea că același identificator nu va fi purtat niciodată de două înregistrări distincte, chiar dacă acestea nu coexistă în același timp.

CHEIE EXTERNĂ

De la versiunea 3.6.19 , SQLite este capabil să gestioneze constrângerile cheii străine .

Din motive de compatibilitate inversă, suportul pentru chei străine nu este activat în mod implicit. Activarea se face prin pragma foreign_keys .

Orice coloană la care se face referire printr-o cheie străină trebuie declarată ca UNICĂ ( CHEIA PRIMARĂ creează o cheie unică ). SQLite nu ia încă în considerare clauza MATCH în definiția cheilor străine.

Declanșatoare

SQLite gestionează declanșatoarele într-un mod destul de complet. Pot fi raportate declanșatoarele ÎNAINTE , DUPĂ sau ÎN loc de . SQLite acceptă opțiunea FOR EACH ROW (operație implicită), dar nu FOR FIECARE DECLARAȚIE .

Vizualizări

SQLite permite crearea de vizualizări pentru a reduce durata interogărilor.

Vizualizările sunt numai în citire, dar este posibil să utilizați declanșatoare cu proprietatea INSTEAD OF pentru a simula capacitatea de a le modifica.

Tranzacții

Toate comenzile SQL care vizează schimbarea stării bazei de date (aproape orice altă comandă decât SELECT ) implică crearea unei tranzacții dedicate acestora, atâta timp cât o tranzacție care include comanda nu este deja creată. Aceasta înseamnă că toate comenzile sunt atomice . Dacă executarea comenzii nu provoacă o eroare, modificarea este comisă automat ( autocommit ), dar dacă nu este cazul, toate modificările făcute de comandă sunt anulate.

Toate modificările aduse bazei de date sunt serializate: se efectuează o singură modificare odată și baza de date este blocată pentru citire în timpul unei modificări.

SQLite permite crearea de tranzacții, precum și crearea de puncte de returnare ( SAVEPOINT ), dar nu permite gestionarea diferitelor grade de izolare. Într-o tranzacție, în timpul primului apel la o comandă de citire, este activată o blocare partajată care autorizează accesul la citire, dar interzice orice modificare a datelor de către o altă tranzacție, în timpul primului apel de scriere, întreaga bază de date este citită și scriere blocată pentru alte tranzacții .

ACID

Chiar dacă SQLite la prima vedere respectă setul de proprietăți ACID , care determină fiabilitatea unui sistem tranzacțional, este totuși posibil să puneți baza de date într-o stare inconsistentă, deoarece tipurile nu sunt forțate: este posibil, de exemplu, să introduceți un șir de caractere dintr-o coloană al cărui tip de afinitate este definit ca un întreg . În interpretările lor stricte, SQLite nu respectă setul de proprietăți ACID.

Mese temporare

SQLite permite crearea de tabele temporare a căror definiție, date și indexuri nu sunt salvate în fișierul bazei de date și, prin urmare, se pierd atunci când baza de date este închisă.

Tabelele virtuale

Este posibil să creați, direct din bibliotecă, propriul motor de stocare pentru a simula un tabel de baze de date. Crearea unui tabel virtual se face prin implementarea unui set de funcții. Accesul la masă este complet transparent, în afară de absența anumitor funcționalități (imposibil să se creeze declanșatoare sau indici sau să se modifice structura tabelului).

Acest mecanism permite accesul utilizând limbajul SQL la orice tip de sursă de date, cum ar fi fișierele CSV sau XML .

Funcțiile utilizatorului

SQLite oferă o interfață de programare, prin biblioteca sa, pentru crearea funcțiilor utilizatorului. Setul de funcții definit de bibliotecă poate fi suprasolicitat , pentru a redefini implementarea acestora. Unii operatori, cum ar fi LIKE, folosesc funcții omonime ca un sub-strat, care poate fi, de asemenea, înlocuit cu funcții definite de utilizator.

SQLite nu acceptă crearea de proceduri , dar nevoia lor este mai mică datorită arhitecturii încorporate.

Index

SQLite permite crearea de indici pe una sau mai multe coloane. Indicii pot fi crescători ( ASC ) sau descendenți ( DESC ), precum și unici (acest lucru este similar cu crearea unei constrângeri de unicitate). SQLite folosește arborele B al indexului .

SQLite introduce cuvântul cheie EXPLAIN care este folosit pentru a descrie pașii necesari pentru a executa o comandă, precum și indexurile utilizate.

Pragme

Pragmele sunt perechi cheie / valoare de configurare SQLite. Acestea sunt interne unei baze de date și vă permit să descrieți cum SQLite ar trebui să interpreteze anumite operațiuni. De asemenea, vă permit să activați sau să dezactivați anumite funcții, în special din motive de compatibilitate inversă.

Adopţie

În afară de implementarea sa oficială în C , există legături pentru alte limbi ( C ++ , Perl , Ruby , TCL , limbi folosind cadrul .NET prin intermediul unui driver ADO.NET ...).

Unele limbaje de programare includ SQLite în biblioteca lor standard , de exemplu, Python (din versiunea 2.5) și PHP (din versiunea 5).

SQLite este utilizat în multe software-uri gratuite, cum ar fi Mozilla Firefox , în multe distribuții GNU / Linux , în sisteme de operare pentru server și desktop , cum ar fi Solaris sau mobile, cum ar fi Android sau Symbian , în unele programe de la Apple , Google , Adobe și McAfee , precum și unele dispozitive Philips .

SQLite este disponibil și cu versiunea 8.4 a software-ului Primavera P6 de la Oracle.

Proiectul privind stocarea unei baze de date SQL pe partea browserului web publicat de W3C afirmă, de asemenea, că software-ul care implementează această caracteristică trebuie să poată interpreta corect dialectul SQLite în versiunea sa 3.6.19 . Deși SQLite nu este pus în aplicare de W3C, Google Chrome , Apple Safari și Opera Browser îl folosesc în acest scop.

Diferite versiuni

SQLite există în 2 versiuni principale: 2.x și 3.x. Versiunile SQLite 2 și 3 se disting prin mai multe evoluții:

  • fișierele bazei de date nu sunt întotdeauna compatibile între ele. Aceasta înseamnă că o bază de date în format SQLite 2 nu poate fi citită cu certitudine de SQLite 3 și invers  ;
  • Sintaxele SQL nu sunt prezente în SQLite 2: DACĂ NU EXISTĂ pentru interogări și CREAȚI TABEL , ADĂUGAȚI CULOANĂ și RENUMIȚI CULOANĂ pentru interogările ALTER TABLE  ;
  • doar cele mai recente versiuni ale SQLite acceptă anumite caracteristici mai avansate, cum ar fi gestionarea cheilor străine sau constrângerile CHECK  ;
  • SQLite 3 acceptă standardele UTF-8 și UTF-16  ;
  • SQLite 3 codifică identificatorii de rând pe 64 de biți și nu mai pe 32 de biți , ceea ce permite un număr aproape nelimitat de rânduri;
  • PHP utilizează o clasă PDO sau, cu PHP 5.3, funcțiile sqlite3 _ * () pentru a gestiona SQLite 3 în timp ce folosește funcțiile sqlite _ * () pentru SQLite 2.

Note și referințe

  1. „  SQLite Release 3.36.0 On 2021-06-18  ” (accesat la 18 iunie 2021 )
  2. „  SQLite Copyright  ” , pe www.sqlite.org
  3. „  Despre SQLite  ” , pe www.sqlite.org
  4. „  Utilizatori cunoscuți ai SQLite  ” , pe www.sqlite.org
  5. „  Cel mai utilizat motor de baze de date SQL  ” , pe www.sqlite.org
  6. (în) Michael Owens , The Definitive Guide to SQLite , Berkeley, Apress,2006( ISBN  978-1-59059-673-9 , DOI  10.1007 / 978-1-4302-0172-4_1 )
  7. „  The SQLite Bytecode Engine  ” , la www.sqlite.org
  8. „  Motorul de baze de date virtuale al SQLite  ” , pe www.sqlite.org
  9. „  Arhitectura SQLite  ” , pe www.sqlite.org
  10. „  Caracteristici SQL pe care SQLite nu le implementează  ” , pe www.sqlite.org
  11. „  Zero-Configuration  ” , pe www.sqlite.org
  12. „  SQLite este un sistem autonom  ” , pe www.sqlite.org
  13. „  SQLite: baza de date cu un singur fișier  ” , pe www.sqlite.org
  14. "  Tipuri de date în SQLite versiunea 3  " , pe www.sqlite.org
  15. "  Limbaj de interogare SQLite: CREATE TABLE  " , pe www.sqlite.org
  16. „  Prezentare generală a versiunii 3 SQLite  ” , pe www.sqlite.org
  17. „  NULL Handling in SQLite  ” , pe www.sqlite.org
  18. „  SQLite Query Language: Data and Time Functions  ” , pe www.sqlite.org
  19. „  Diagrame de sintaxă pentru SQLite  ” , pe www.sqlite.org
  20. „  SQLite Autoincrement  ” , pe www.sqlite.org
  21. „  SQLite Foreign Key Support  ” , pe www.sqlite.org
  22. „  SQLite Query Language: CREATE TRIGGER  ” , pe www.sqlite.org
  23. „  Limbaj de interogare SQLite: CREATE VIEW  ” , pe www.sqlite.org
  24. „  SQLite Query Language: SAVEPOINT  ” , pe www.sqlite.org
  25. „  Blocarea fișierelor și concurența în SQLite versiunea 3  ” , pe www.sqlite.org
  26. „  SQLite Query Language: BEGIN TRANSACTION  ” , pe www.sqlite.org
  27. „  Mecanismul tabelului virtual al SQLite  ” , pe www.sqlite.org
  28. „  SQLite Query Language: Core Functions  ” , pe www.sqlite.org
  29. „  SQLite Query Language: CREATE INDEX  ” , pe www.sqlite.org
  30. „  SQLite Query Language: EXPLAIN  ” , pe www.sqlite.org
  31. „  Declarații Pragma acceptate de SQLite  ” , pe www.sqlite.org
  32. http://sqlite.phxsoftware.com/
  33. "  sqlite3 - Interfață DB-API 2.0 pentru baze de date SQLite - documentație Python 3.7.3  " , pe docs.python.org
  34. „  PHP: Hypertext Preprocessor  ” , pe www.php.net
  35. „  Baza de date Web SQL  ” la dev.w3.org
  36. „  Mai multe resurse pentru dezvoltatori  ”
  37. „  Demonstrație WebKit HTML 5 SQL Storage Notes  ” , pe webkit.org
  38. „  Dev.Opera - Blog  ” , pe dev.opera.com

linkuri externe