Editor Sqlite în limba rusă. Program gratuit SQLiteStudio pentru editarea bazelor de date SQLite. De ce toată lumea se plânge că SQLite este lent?

În cele din urmă, am decis să scriu un articol despre SQLite, în care vreau să rezumam experiența mea de 3 ani de utilizare a acestei baze de date sub Windows. Văd că subiectul este popular, dar există puține informații.

O mică notă introductivă.

Acest articol nu este pentru programatori începători.
Nu este un tutorial SQL.
Ea nu susține utilizarea SQLite.
Ea nu pledează pentru a nu folosi SQLite.
Articolul este scris sub formă de întrebări de la un începător ipotetic la SQLite și răspunsuri la acestea (din moment ce există multe informații și este cel puțin puțin mai ușor să o structurați în acest fel).

Ce este SQLite?
SQLite este o bază de date încorporată multiplatformă care acceptă un set destul de cuprinzător de comenzi SQL și este disponibilă în codul sursă (în C).

Codurile sursă SQLite sunt în domeniul public, ceea ce înseamnă că nu există deloc restricții de utilizare.

Site web (cu documentație excelentă în limba engleză): http://sqlite.org

Versiunea curentă: 3.7.13

Puteți compila singur SQLite, dar îl descarc deja compilat ca DLL Windows.

Pentru propriul asamblare, de obicei descărcați așa-numitul. "amalgamare"
aceste. Surse SQLite sub forma unui singur fișier în C + sqlite3.h.

Pentru a reduce dimensiunea codului SQLlite prin eliminarea lucrurilor inutile, sunt folosite tot felul de DEFINE.

Cât de popular este SQLite?
Pe scurt: ea este peste tot. Cel puțin pe orice smartphone.
Cât de fiabil este?
Foarte. Când o versiune este lansată, trece printr-o serie de teste automate serioase (se efectuează ~ 2 milioane de teste), acoperirea codului prin teste este de 100% (din august 2009).
Ce alte instrumente oferă dezvoltatorii?
Este disponibil un utilitar de consolă pentru lucrul cu bazele de date (sqlite3.exe, „un shell de linie de comandă pentru accesarea și modificarea bazelor de date SQLite”).
Asta e tot?
Da, totul de la dezvoltatorii principali. Cu toate acestea, alți oameni scriu tot felul de manageri etc.
Personal nu l-am gasit niciodata pe cel ideal si folosesc consola.
Ce înseamnă „set suficient de complet de SQL”?
După cum știți, SQL s-a mutat în direcții diferite în dezvoltarea sa. Marii producători au început să introducă tot felul de extensii. Și deși sunt acceptate tot felul de standarde (SQL 92), în viața reală toate bazele de date mari nu suportă pe deplin standardele + au ceva al lor. Deci, SQLite încearcă să trăiască după principiul „setului minim, dar complet”. Nu acceptă lucruri complicate, dar este aproape la fel ca SQL 92.
Și introduce unele dintre propriile caracteristici, care sunt foarte convenabile, dar nu standard.
Ce anume este vorba despre suportul SQL care ar putea cauza confuzie?
Nu puteți șterge sau modifica o coloană dintr-un tabel (ALTER TABLE DROP COLUMN..., ALTER TABLE ALTER COLUMN...).
Există declanșatoare, dar nu la fel de puternice ca cele ale RDBMS-urilor mari.
Există suport pentru chei străine, dar implicit este DEZACTIVAT.
Nu există suport încorporat pentru UNICODE (dar, în general, nu este dificil de realizat).
Fără proceduri stocate.
Ce este bun sau neobișnuit?
a) Fiecare înregistrare conține o coloană rowid virtuală, care este egală cu un număr de 64 de biți (unic pentru tabel).
Puteți declara coloana INTEGER PRIMARY KEY și apoi această coloană va deveni rowid (cu propriul nume, numele rowid încă funcționează).
Când inserați o înregistrare, puteți specifica un rowid sau nu îl puteți specifica (și apoi sistemul va insera unul unic).
Detalii: www.sqlite.org/autoinc.html
b) puteți organiza cu ușurință baza de date în memorie (acest lucru este foarte convenabil și vă voi spune mai multe despre ea puțin mai târziu);
c) ușor de transportat: implicit, baza de date este un singur fișier (în format cross-platform);
d) tipul de coloană nu determină tipul valorii stocate în acest câmp de înregistrare, adică orice valoare poate fi introdusă în orice coloană;
e) multe funcții încorporate (care pot fi folosite în SQL): www.sqlite.org/lang_corefunc.html;
Nu înțeleg - ce este în neregulă cu tipul? Atunci de ce aveți nevoie de un tip de coloană?
Tipul de coloană determină modul în care sunt comparate valorile (acestea trebuie convertite într-un singur tip atunci când se compară, de exemplu, în interiorul unui index).
Dar nu vă obligă să introduceți valori de acest tip special în coloană. Ceva ca o tastare slabă.

Să presupunem că am declarat o coloană drept „UN INTEGER”.
SQLlite vă permite să introduceți valori de orice tip în această coloană (999, „abc”, „123”, 678.525).
Dacă valoarea care este inserată nu este un număr întreg, atunci SQLlite încearcă să o transforme într-un număr întreg.
Aceste. șirul „123” se va transforma în întregul 123, iar valorile rămase vor fi scrise „ca atare”.

Deci, este posibil să nu specificați deloc tipul de coloană?
Acest lucru se face foarte des: CREATE TABLE foo (a,b,c,d).
Dar arhitectura? Nu există server?
Nu există server, aplicația în sine este un server. Accesul la baza de date are loc prin „conexiuni” la baza de date (ceva ca un handle de fișier OS), pe care le deschidem printr-un apel la funcția DLL corespunzătoare. La deschidere, este indicat numele fișierului bazei de date. Dacă nu există așa ceva, este creat automat.
Este acceptabil să deschideți mai multe conexiuni la aceeași bază de date (prin intermediul unui nume de fișier) în aceleași aplicații sau în diferite aplicații.
Sistemul folosește mecanisme de blocare a accesului la fișiere la nivel de sistem de operare pentru a face totul să funcționeze
(aceste mecanisme de obicei nu funcționează bine pe unitățile de rețea, așa că nu este recomandat să utilizați SQLlite cu un fișier într-o rețea).
Inițial, SQLlite a funcționat pe principiul „mulți citesc, unul scrie”.
Adică, o singură conexiune scrie în baza de date la un moment dat. Dacă și alte conexiuni încearcă să scrie și ele, vor primi eroarea SQLITE_BUSY.
Cu toate acestea, puteți introduce un timeout de operare. Apoi conexiunea, în fața unei baze de date ocupate, va aștepta N secunde înainte de a eșua cu eroarea SQLITE_BUSY.
Deci ce ar trebui să facem?
Fie o conexiune și toate solicitările prin intermediul acesteia, fie procedați de la un posibil timeout și asigurați repetarea execuției SQL.
Mai există o posibilitate: nu cu mult timp în urmă a apărut un nou tip de jurnal SQLlite: Write Ahead Log, WAL.
Dacă activați acest mod special de jurnal pentru baza de date, atunci mai multe conexiuni vor putea modifica simultan baza de date.
Dar în acest mod baza de date ocupă deja mai multe fișiere.
Ei bine, acum este clar de ce SQLite este groaznic, pentru că nu are un CACHE GLOBAL?
Într-adevăr, toate RDBMS-urile moderne sunt de neconceput fără un cache partajat global, care poate stoca tot felul de bunătăți, cum ar fi interogări parametrizate compilate. Acest lucru este realizat de un server care nu este aici. Cu toate acestea, în cadrul aceleiași aplicații, SQLlite poate partaja memoria cache între mai multe conexiuni (citiți aici: www.sqlite.org/sharedcache.html) și poate salva puțină memorie.
De ce toată lumea se plânge că SQLite este lent?
Două motive. Prima este setările implicite. Ele funcționează pentru fiabilitate, nu performanță.
Al doilea este lipsa de înțelegere a mecanismului de înregistrare a tranzacțiilor. În mod implicit, după orice comandă, SQLlite va comite tranzacția (adică așteptați până când baza de date este într-o stare consecventă înainte de a opri alimentarea). În funcție de modul paranoia, SQLite va cheltui de la 50 la 300 ms pe aceasta (așteptând sfârșitul scrierii datelor pe disc).
Ce ar trebuii să fac? Trebuie să introduc 100 de mii de înregistrări și repede!
Ștergeți indexurile, activați modul de sincronizare OFF (sau NORMAL), introduceți în porțiuni de N mii (N - selectați, luați 5000 pentru a începe). Înainte de a introduce o porțiune, faceți BEGIN TRANSACTION, după - COMMIT.
Dar am găsit o greșeală! Cum să raportezi?
În nici un caz.

Chestia este că popularitatea SQLite este înfricoșătoare - este peste tot. Aceasta nu este o glumă.
Iar dezvoltatorii s-au confruntat cu un val de mesaje de eroare care au fost cauzate fie de neînțelegeri, fie au fost solicitări de funcții ascunse. De fapt, au închis acceptarea directă a rapoartelor cu erori.
Așa că ar trebui să vă înscrieți pe lista de corespondență și să vă publicați problema acolo și să sperați că este mai bine.

Personal, am avut o situație pe care am interpretat-o ​​ca un defect în SQLIte. Am descris asta în newsletter. Comportamentul SQLite a fost corectat în versiunea următoare.

Un utilitar la îndemână pentru a juca cu SQLite.

De continuat.

Etichete: Adăugați etichete

SQLite Editor este conceput pentru editarea bazelor de date în diverse aplicații. Programul poate fi integrat direct în RooTExplorer pentru o mai mare comoditate.

Caracteristică

Dezvoltatorii care lucrează cu SQL vor putea vizualiza și edita datele din bazele de date direct pe platformele mobile. Puteți salva instantaneu rezultatul fără a întrerupe funcționarea ulterioară a unei aplicații terță parte.
Aplicația SQLite Editor funcționează excelent cu RootExplorer. Managerul de fișiere deschide noi posibilități de utilizare a aplicației, permițându-vă să deschideți baze de date direct din managerul de fișiere. În plus, în manager puteți adăuga baze de date la favorite, le puteți sorta și le puteți stoca convenabil. Există, de asemenea, o filă cu istoricul programelor deschise recent. Aceste caracteristici fac mult mai ușor navigarea și căutarea bazelor de date editate, astfel încât să puteți face modificări mai târziu.

Particularități

Aplicația poate funcționa cu sau fără drepturi de root. În acest din urmă caz, accesul este asigurat doar la bazele de date ale acelor aplicații care sunt instalate pe cardul SD. În plus, după cum sa menționat mai sus, aplicația este strâns combinată cu RootExplorer, iar acest manager de fișiere necesită drepturi de super-utilizator pentru a funcționa. Singurul lucru care poate complica utilizarea aplicației este lipsa localizării în limba rusă. Dar acest inconvenient este pe deplin compensat de stabilitatea și viteza de operare, de navigare clară și de funcții familiare pentru dezvoltatorii care lucrează cu SQL.

SQLite este o bază de date relațională compactă, încorporată. Codul sursă al bibliotecii a fost eliberat în domeniul public. În 2005, proiectul a primit premiile Google-O'Reilly Open Source.

Cuvântul „încorporat” înseamnă că SQLite nu folosește paradigma client-server, adică motorul SQLite nu este un proces separat de rulare cu care programul interacționează, ci oferă o bibliotecă cu care programul este legat și motorul devine un parte integrantă a programului. Astfel, apelurile de funcții (API) ale bibliotecii SQLite sunt utilizate ca protocol de schimb. Această abordare reduce cheltuielile generale, timpul de răspuns și simplifică programul. SQLite stochează întreaga bază de date (inclusiv definiții, tabele, indecși și date) într-un singur fișier standard pe computerul pe care este executat programul. Simplitatea implementării se realizează datorită faptului că înainte de începerea unei tranzacții de scriere, întregul fișier care stochează baza de date este blocat; Funcțiile ACID sunt realizate, printre altele, prin crearea unui fișier jurnal.

Mai multe procese sau fire pot citi simultan date din aceeași bază de date fără probleme. Scrierea în baza de date se poate face numai dacă nu sunt în prezent servite alte cereri; în caz contrar, încercarea de scriere eșuează și un cod de eroare este returnat programului. O altă opțiune este de a repeta automat încercările de înregistrare într-un interval de timp specificat.

Pachetul include și o parte funcțională client sub forma unui fișier executabil sqlite3, care demonstrează implementarea funcțiilor bibliotecii principale. Partea client funcționează din linia de comandă și vă permite să accesați fișierul bazei de date pe baza funcțiilor standard ale sistemului de operare.

Datorită arhitecturii motorului, este posibilă utilizarea SQLite atât pe sisteme încorporate, cât și pe mașini dedicate cu matrice de date gigabyte.

SQLite acceptă tastarea dinamică a datelor. Tipuri de câmpuri posibile: INTEGER, REAL, TEXT, BLOB.

Folosind SQLite

Biblioteca SQLite în sine este scrisă în C; există un număr mare de legături către alte limbaje de programare, inclusiv Delphi, C++, Java, C#, Visual Basic .NET, Perl, PureBasic, Tcl (instrumente Tcl incluse cu SQLite), Haskell, Scheme, Smalltalk și Parser. ca multi altii. O listă completă a instrumentelor existente este disponibilă pe pagina proiectului.

Simplitatea și ușurința de încorporare a SQLite a dus la utilizarea bibliotecii în browsere, playere muzicale și multe alte programe.

În special, SQLite este utilizat:

  • - mediu pentru rularea aplicațiilor (parțial);
  • Autoit;
  • cadru ;
  • cadru Yii; (disponibil);
  • Platformă XUL alimentată de Gecko 1.9+, 1.9+ și eventual toate aplicațiile bazate pe această platformă, inclusiv:
  • Unele modele de navigatoare GPS Garmin;
  • API Android;
  • Minetest.

Multe programe acceptă SQLite ca format de stocare a datelor (în special Mac OS și iOS, Android), inclusiv:

  • 1C:Enterprise 7.7 (folosind o componentă externă);
  • 1C:Enterprise 8.3 (pentru stocarea intrărilor de jurnal);
  • Adobe Photoshop Lightroom;
  • Eserv;
  • Punctul F;
  • (din versiunea 3.0);
  • Daminion;

Lucrezi cu baze de date SQL? Atunci această aplicație va veni cu siguranță la îndemână - cu ajutorul ei puteți vizualiza, edita și salva baze de date în orice aplicație.

Particularități

Editorul SQLite nu necesită drepturi de superutilizator în mod implicit. Dar fără ele, vă va permite să editați și să salvați bazele de date modificate numai ale acelor aplicații care sunt instalate pe MicroSD.

Cu drepturi de root, la rândul său, vei putea ajusta bazele de date ale oricăror aplicații - inclusiv cele aflate în memoria internă.

Programul interacționează bine cu funcționalitatea managerului de fișiere RootExplorer. Cu ajutorul acestuia, puteți deschide în mod convenabil baze de date în aplicație, vizându-le în catalog.

În plus, directorul de fișiere vă permite să adăugați fișiere SQL la favorite, făcându-le mai ușor de găsit. Există și un istoric (se află și în aplicația în sine), unde se află informații despre căile recente.

Înregistrare

Programul poartă doar o sarcină funcțională. Prin urmare, puteți uita de frumusețea din interfață. Meniul principal este prezentat în culori stricte albastru închis și negru.

Un font simplu și pictograme pseudo-3D sunt câteva dintre celelalte caracteristici ale interfeței.

În plus, nu există o localizare în limba rusă. Cu toate acestea, acest lucru nu împiedică utilizatorii cunoscători să navigheze în instrumentele utilitarului.

Acest program la îndemână va deveni un asistent de încredere pentru tociști și utilizatori avansați care ar dori să facă modificări aplicațiilor direct pe dispozitivul lor mobil.