Sari la conținut

SQLite

De la Wikipedia, enciclopedia liberă

SQLite este o mică librărie C care implementează un motor de baze de date SQL încapsulat, oferă posibilitatea de a-l introduce în diverse sisteme şi necesită zero-configurare.

Ce este SQLite?

SQLite este o mică librărie C care implementează un motor de baze de date SQL încapsulat, oferă posibilitatea de a-l introduce în diverse sisteme şi necesită zero-configurare. Caracteristicile includ:

  • Tranzacţiile sunt atomice, consistente, izolate şi durabile (ACID) chiar după căderi de sistem şi pene de current.
  • Zero-configurare - nici o setare sau administrare necesară.
  • Implementează o mare parte a SQL92. (sunt unele caracteristici nesuportate)
  • O bază de date întreagă este stocată într-un singur fişier de pe HDD.
  • Fişierele bază de date pot fi liber partajate între maşini cu ordine diferită de octeţi.
  • Suportă baze de date de până la 2 terraocteţi (2 ^ 41 octeţi) în mărime.
  • Mărimea şirurilor şi BLOB-urile limitate doar de memoria disponibilă.
  • Cod de bază mic: mai puţin de 250KiO configurat complet sau mai puţin de 150KiO cu caracteristici opţionale omise.
  • Mai rapid decât baze de date client/server cunoscute pentru majoritatea operaţiilor obişnuite.
  • API simplu, uşor de folosit.
  • Legături TCL incluse. Legături către alte multe limbaje disponibile separat.
  • Cod sursă foarte bine comentat cu peste 95% acoperire prin teste.
  • Încapsulat: nu are dependenţe externe.
  • Sursele sunt în domeniul public. Poate fi folosit pentru orice scop.

Distribuţia SQLite vine cu un program linie-comandă de sine stătător (sqlite) care poate fi folosit pentru a administra o bază de date SQLite şi care serveşte că un exemplu despre modul în care să folosiţi librăria SQLite.

Întrebuinţările SQLite

SQLite este diferit de majoritatea altor motoare de baze de date SQL prin aceea că a fost proiectat pentru a fi simplu:

  • Simplu de administrat
  • Siplu de folosit
  • Simplu de a fi încapsulat într-un program mai mare
  • Simplu de întreţinut şi setat

Multora le place SQLite deoarece este mic şi rapid. Dar aceste calităţi sunt doar accidente fericite. Utilizatorii descoperă, deasemenea, că SQLite este foarte sigur. Siguranţă este o consecinţă a simplismului. Cu mai puţină complicare, este mai puţin loc de greşeli. Deci, da, SQLite este mic, rapid şi de încredere (sigur), dar în primul rând şi cea mai mare calitate a lui este aceea că reuşeşte să fie simplu. Simplicitatea într-un motor de baze de date poate fi fie un punct tare, fie unul slab, depinde de ceea ce încerci să faci. Pentru a atinge simplicitatea, SQLite a trebuit să sacrifice alte caracteristici care sunt găsite de unii oameni folositoare, că cea a concurenţei înalte, controlul la accesul detaliat, un set bogat de funcţii implementate, proceduri stocate, caracteristici ezoterice a limbajului SQL, extensii XML şi/sau Java, scalabilitate tera- sau peta-octet şi aşa mai departe. Dacă ai nevoie de unele din aceste caracteristici şi nu îţi pasă de complexitatea adugată pe care o aduc, atunci SQLite nu este probabil baza de date de care ai nevoie. Nu este proiectat să concureze cu Oracle sau cu PostgreSQL.

Regulă de bază pentru când este potrivit să folosim SQLite este această: foloseşte SQLite în situaţii unde simplicitatea de administrare, implementare şi întreţinere sunt mai importante decât nenumăratele caracteristici complexe pe care motoarele de baze de date enterprise le furnizează. După cum se dovedeşte, situaţiile unde simplicitatea este o alegere mai bună sunt mai des întâlnite decât mulţi oameni realizează.

Situaţii în care SQLite merge bine

  • Site-uri web

SQLite de obicei va merge formidabil că bază de date pentru trafic al site web-urilor mic spre mediu (care este, să spunem, 99.9% din toate site web-urile). Cantitatea de traffic web pe care SQLite îl poate administra depinde, binenţeles, de cât de mult foloseşte site-ul web baza de date. În general, orice site care primeşte mai puţin de 100000 de vizite/zi ar trebuii să meargă bine cu SQLite. Cele 100000 de vizite/zi sunt o estimare conservativă, nu o limită maximă. SQLite a fost demonstrat că merge şi cu de 10 ori această cantitate de trafic.

  • Dispozitive şi aplicaţii încapsulate

Deoarece o bază de date SQLite necesită puţină (sau deloc) administrare, SQLite este o alegere bună pentru dispozitive sau servicii care trebuiesc să meargă neadministrate sau fără sprijin uman. SQLite este potrivit pentru a fi folosit în telefoane mobile, PDA-uri şi altele. Ar putea merge bine şi ca bază de date încapsulată în aplicaţii consumator descărcabile.

  • Format de fişier la aplicaţii

SQLite a fost folosit cu succes că un fişier pe disc sau aplicaţii desktop că unealtă de analiză financiară, pachete CAD, programe de ţinut înregistrări şi aşa mai departe. Operaţia tradiţională File/Open face un sqlite3_open() şi execută un BEGIN TRANSACTION pentru a obţine acces exclusiv la conţinut. File/Save face un COMMIT urmat de un alt BEGIN TRANSACTION. Folosirea tranzacţiilor garantează că update-urile la fişierul aplicaţiei sunt atomice, consistente, izolate şi durabile (ACID). Declanşatoare temporare pot fi adăugate bazei de date pentru a înregistra toate schimbările într-o tabela de logare (temporară) Undo/Redo. Aceste schimbări pot fi după aceea urmărite când utilizatorul apasa butoanele Undo şi Redo. Folosind această tehnică, o implementare pentru un număr de paşi nelimitaţi Undo/Redo poate fi scrisă în surprinzător de puţin cod.

  • Înlocuitor pentru fişierele disc ad hoc

Multe programe folosesc fopen(), fread() şi fwrite() pentru a creea şi administra fişiere de date în formate proprii. SQLite merge foarte bine că înlocuitor pentru aceste fişiere de date ad hoc.

  • Baze de date interne sau temporare

Pentru programe care au o mulţime de date care trebuiesc mutate sau sortate în diverse direcţii, este de obicei mai uşor şi mai rapid să încarce datele într-o bază de date SQLite în-memorie şi să folosesca query-uri cu JOIN-uri şi clauze ORDER BY pentru a extrage datele în formă şi ordinea dorită, decât să încerce codarea acestor operaţii manual. Folosind o bază de date SQL intern în acest mod oferă deasemenea programului o flexibilitatea mai mare de când coloane noi şi indici pot fi adăugaţi fără a recoda fiecare query.

  • Unealtă linie-comandă pentru analiză dataset-urilor

Utilizatorii SQL experimentaţi pot pune programul linie-comandă sqlite pentru a analiza diferite dataset-uri. Date brute pot fi importate din fişiere CSV (Comma Separated Values - Valori Separate prin Virgulă), după acea datele pot fi tăiate şi aranjate pentru a genera o miriadă (un număr foarte mare) de rapoarte scurte. Utilizări posibile includ analiză log-urilor pe un site, analiză statisticilor sportive, compilarea metricilor programării şi analiza rezultatelor experimentale. Poţi, binenteles, să faci acelaşi lucru cu o bază de date enterprise client/server. Avantajul în folosirea SQLite în această situaţie este acela că SQLite este mai uşor de configurat şi bază de date rezultată este un singur fişier pe care îl poţi stoca pe o dischetă, un pen-drive sau un e-mail către un coleg.

  • Înlocuitor al unei baze de date enterprise în timpul unor demo-uri sau teste

Dacă scri o aplicaţie client pentru un motor de baze de date enterprise, este logic să foloseşti o structură de bază de date generică care îţi permite să te conectezi la multe diferite tipuri de motoare de baze de date SQL. Este şi mai logic să faci pasul de a include SQLite în amestecul de baze de date suportate şi să legi static motorul SQLite cu clientul. În acest mod programul client poate fi folosit de sine stătător cu un fişier SQLite pentru teste sau pentru demonstraţii.

  • Pedagogia bazelor de date

Deoarece este simplu de setat şi folosit (instalarea este trivială: doar copiezi SQLite sau executabilul sqlite.exe pe maşină dorită şi îl rulezi) SQLite devine un motor de baze de date apt pentru a fi folosit în predarea SQL. Studenţii pot uşor creea oricât de multe baze de date doresc şi pot trimite cu ajutorul e-mail-ului aceste baze de date către profesor pentru observaţii sau pentru notare. Pentru studenţi mai avansaţi care sunt interesaţi în studiat cum este implementat un RDBMS, codul SQLite foarte bine documentat, comentat şi modular poate servi că o bază bună. Nu spunem că SQLite este un model exact a cum sunt implementate alte motoare de baze de date, dar un student care înţelege cum funcţionează SQLite poate mult mai rapid înţelege principiile operaţionale ale altor sisteme. Extensiile experimentale de limbaj SQL Arhitectură simplă şi modulară a SQLite face din el o platformă bună pentru prototipizarea de idei şi caracteristici noi pentru limbajul bazei de date (experimente).

Situaţii în care alt RDBMS ar merge mai bine

  • Aplicaţii Client/Server

Dacă ai multe programe client care accesează o bază de date comună peste o reţea ar trebuii să consideri folosirea unui motor de baze de date client/server în locul a SQLite. SQLite va merge peste o reţea de fişiere sistem, dar din cauza latenţei asociată majorităţii fisierelor sistem reţea, performanţa nu va fi satisfăcătoare. De asemenea, implementarea blocării a multor fisieresitem reţea (logică) conţine bug-uri (şi pe Unix şi pe Windows). Dacă blocarea fişierului nu merge aşa cum ar trebui, este posibil că două sau mai multe programe client să modifice aceeaşi parte a aceeaşi bază de date în acelaşi moment, rezultând în o corupere a bazei de date. Deoarece această problemă rezultă din bug-uri din implementarea ce stă la bază fisierelor sistem, nu este nimic ce SQLite ar putea face să prevină problema. O bună regulă este aceea că ar trebui să eviţi folositea SQLite în situaţii în care aceeas bază de date va fi accesată simultan de mai multe calculatoare într-un fişier sistem reţea.

  • Site-uri web cu volum mare

SQLite va merge în mod normal bine că bază de date ce sprijină un site web. Însă dacă site-ul tău web este atât de aglomerat încât te gândeşti să împarţi componenţa bazei de date pe o maşină separată, atunci cu siguranţă ar trebui să iei în considerare folosirea unui motor de baze de date client/server în locul SQLite.

  • Dataset-uri foarte mari

Când începi o tranzacţie în SQLite (ceea ce se întâmplă automat înainte de orice operaţie de scriere care nu este într-un explicit BEGIN...COMMIT) motorul are de alocat un bitmap de pagini murdare în fişierul disc pentru a-l ajută la administrarea jurnalului rollback (de revenire). SQLite necesită 256 de octeţi de RAM pentru fiecare 1Mo de bază de date. Pentru baze de date mai mici, cantitatea de memorie necesară nu este o problemă, dar când bază de date începe să crească în rangul mulţi-gigaocteţi, mărimea bitmapului poate devenii foarte largă. Dacă trebuie să depozitezi şi să modifici mai mult de câteva duzini de Go de date, atunci ar trebui să te gândeşti să foloseşti un motor de baze de date diferit.

  • Concurenţă

SQLite foloseşte lacăte reader/writer pe întregul de date. Orice proces citeşte din orice parte bazei de date, toate celelalte procese sunt oprite din orice punct a bazei de date. Similar, oricând un proces scrie date, toate celelalte procese sunt oprite din citit orice parte a bazei de date. Pentru multe situaţii nu este o problemă. Fiecare aplicaţie face propria operaţie peste de date lucreaza rapid şi trece mai departe, nici o închidere nu durează mult de câteva milisecunde. Sunt unele aplicaţii, însă, care necesită mai multă concurenţă, şi acele aplicaţii ar avea nevoie de abordări diferite.

Caracteristicile SQLite

Aratăm în continuare unele din caracteristicile SQLite-ului care sunt neobişnuite şi care fac SQLite diferit de multe alte motoare de baze de date SQL:

  • Zero-Configurare

SQLite nu are nevoie de "instalare" înainte de a fi folosit. Nu există procedura de "setup". Nu există nici un proces server care necesită pornire, oprire sau configurare. Nu este nevoie de un administrator pentru a creea o nouă instanţă de bază de date sau pentru a atribui permisiuni de acces utilizatorilor. SQLite nu foloseşte fişiere de configurare. Nu trebuie făcut nimic pentru a atenţiona sistemul că SQLite rulează. Nici o acţiune nu este necesară pentru a recupera ceva după o cădere de sistem sau după o pană de curent. Nu este nimic de rezolvat.

  • SQLite merge.

Alte motoare de baze de date cunoscute rulează formidabil odată ce le-ai pus pe picioare, însă instalarea iniţială şi configurarea poate fi intimidant de complexă.

  • Fără server

Majoritatea motoarelor de baze de date SQL sunt implementate că un proces server separat. Programe care doresc acces la bază de date comunică cu serverul folosind un fel de comunicare interprocese (tipic TCP/IP) pentru a trimite cereri către server şi să primească înapoi rezultate. SQLite nu lucrează aşa. Cu SQLite, procesul ce doreşte să acceseze bază de date citeşte şi scrie direct din fişierele bază de date de pe disc. Nu există nici un proces server intermediar.

Sunt avantaje şi dezavantaje în a lucra fără server. Marele avantaj este acela că nu există un proces server de instalat, setat, configurat, iniţializat, administrat şi reparat. Acesta este unul din motivele pentru care SQLite este un motor de baze de date "zero-configurare". Programe care folosesc SQLite nu necesită suport administarativ pentru a pregăti motorul de baze de date înainte că acesta să fie rulat. Orice program care este capabil să acceseze discul este capabil să folosească o bază de date SQLite.

Pe de altă parte, un motor de baze de date care foloseşte un server poate oferi o protecţie îmbunătăţită în aplicaţii client - pointeri rătăciţi în un client nu pot corupe memoria pe server. Şi deoarece un server este un proces unic persistent, el este capabil să controleze accesul la bază de date cu o mai mare precizie, permiţând o blocare rafinată şi concurenţă îmbunătăţită.

Majoritatea bazelor de date SQL sunt bazate pe modelul client/server. Din cele care sunt fără server, SQLite este singură care este ştiută, de autor, că permite mai multor aplicaţii să acceseze aceeaşi bază de date în acelaşi timp.

  • Un singur fişier bază de date

O bază de date SQLite este un singur fişier disc (ordinar) care poate fi plasat (localizat) oriunde în ierarhia directoarelor. Dacă SQLite poate citi fişierul disc atunci poate citi orice din bază de date. Dacă fişierul disc şi directorul său sunt writeable (permit scrierea în ele), atunci SQLite poate schimbă orice în bază de date. Fişierele bază de date pot fi uşor copiate pe memory stick-uri USB sau trimise prin e-mail pentru a partajare.

Alte motoare de baze de date SQL tind să stocheze date că o mare colecţie de fişiere. Des aceste fişiere sunt în o locaţie standard pe care numai motorul de baze de date însăşi le poate accesa. Această face datele mai sigure, dar însă face mai greoi şi accesul. Unele motoare de baze de date SQL oferă opţiunea de a scrie direct pe disc şi trecerea, astfel, de fisierul sistem. Această da performanţă, dar pentru costul unui setup considerabil şi complexitate de administrare.

  • Compact

Când este optimizată pentru mărime, inreaga librărie SQLite cu toate opţiunile activate este mai mică de 225KiO (după măsurarea pe un ix86 folosind utilitarul "size" de pe pachetul compliator GNU). Opţiunile nenecesare pot fi dezactivate în timpul compilarii pentru a reduce mai mult mărimea librării până sub 170KiO (dacă se doreşte).

Majoritatea altor motoare de baze de date SQL sunt mult mai mari decât atât. IBM se lăuda că motorul de baze de date recent lansat CloudScape are "numai" un fişier jar de 2MiB - de 10 ori mai mare decât SQLite chiar şi după ce este compresat! Firebird se lăuda că, partea lui client are doar 350KiO. Asta este cu 50% mai mare decât SQLite şi nici măcar nu conţine motorul de baze de date. Librăria DB Berkeley este la Sleepycat este de 450KiO şi omite suport SQL, oferindu-i programatorului doar simple perechi cheie/valoare.

  • Alocarea tipului de date evident

Majoritatea motoarelor de baze de date SQL folosesc atribuire statică a tipului de date. Un tip de data este asociat cu fiecare coloană dintr-un tablou şi doar valorilor a acelui tip de date particular le este permis să fie stocate în acea coloană. SQLite relaxează această restricţie folosind modul de atribuire a tipului de date evident. În acest mod, tipul de date este o proprietate a valorii însăşi, nu a coloanei în care valoarea este stocată. SQLite, astfel, permite utilizatorului să stocheze orice valoare de orice tip în orice coloană necontând tipul declarat al acelei coloane. (Sunt nişte excepţii de la această regulă: O coloană INTEGER PRIMARY KEY poate stoca doar întregi. SQLite încearcă să convearteasca valorile în tipul de date declarat a coloanei când poate.)

Specificaţiile limbajului SQL cer alocarea statică a tipului de date. De aceea uni oameni spun că folosirea modului de alocare a tipului de date evident este un bug în SQLite. Autorii SQLite, pe de altă parte, ţin să creadă că această este o caracteristică. Autorii spun că alocarea statică este un bug în specificaţiile SQL pe care SQLite l-a reparat într-un mod care este compatibil înapoi.

  • Înregistrări de lungime variabilă

Majoritatea altor motoare de baze de date SQL alocă o cantitate fixă de spaţiu de disc pentru fiecare linie în majoritatea tabelelor. Ele utilizează tehnici speciale pentru manevrarea BLOB-urilor şi CLOB-urilor care pot fi de o dimensiune foarte variată. Pentru majoritatea tabelelor, însă, dacă declari o coloanasa fie VARCHAR(100) atunci motorul de baze de date va aloca 100 de octeţi spaţiu pe disc indiferent de cât de multă informaţie stochezi în acea coloană.

SQLite, în contrast, foloseşte numai cantitatea de spaţiu pe disc necesară să stocheze informaţia în o linie. Dacă stochezi un singur caracter în o coloană VARCHAR(100), atunci un singur octet de spaţiu pe disc este folosit (de fapt doi octeţi - este un overhead la începutul fiecărei coloane pentru a-i înregistra tipul de date şi lungimea).

Folosirea înregistrărilor de lungime variabila are un număr de avantaje. Se concretizează, evident, în fişiere bază de date mai mici. De asemenea face bazele de date să ruleze mai rapid, de vreme ce este mai puţină informaţie să fie mişcată de pe şi pe disc. Şi, această metodă face posibilă lui SQLite să folosească atribuirea tipului de date evident în locul metodei de alocare statică.

  • Cod sursă lizibil

Codul sursă a SQLite este proiectat pentru a fi lizibil şi accesibil unui programator mediu. Toate procedurile şi structurile de date şi multe variabile automate sunt comentate cu grijă cu informaţii utile despre ceea ce fac. Comentariile elevate sunt omise.

  • Declaraţiile SQL compilează în cod maşină virtuală

Orice motor de baze de date SQL compilează fiecare declaraţie SQL într-un fel de structură de date internă care este după aceea folosită pentru a indeplini sarcină declaraţiei. Dar, în majoritatea motoarelor SQL acea structură de date internă este o reţea complexă de structuri interconectate şi obiecte. În SQLite, formă compilată a declaraţiilor este un program scurt în un limbaj-maşină că reprezentare. Utilizatorii bazei de date pot să vadă acest limbaj maşină virtuală prin adăugarea la sfârşitul unui query a keyword-ului (cuvântul rezervat) EXPLAIN.

Folosirea unei maşini virtuale în SQLite a fost de un mare folos dezvoltării librăriei. Maşină virtuală oferă o crispă, o bine definită uniune între front-end-ul SQLite (partea care parsează declaraţiile SQL şi generează cod maşină virtuală) şi back-end-ul acestuia (partea care execută codul virtual maşină şi calculează un rezultat). Maşină virtuală permite dezvoltatorilor să vadă clar şi în o manieră uşor de citit ceea ce SQLite încearcă să facă cu fiecare declaraţie pe care o compilează, care este de un ajutor de neimaginat în debugging. Depinzînd de cum este compilat, SQLite deasemenea are capacitatea de a urmării execuţia codului maşină virtual - printand fiecare din instrucţiunile maşinii virtuale şi rezultatele lor în timpul execuţiei.

  • Domeniul public

Codul sursă pentru SQLite este în domeniul public. Nu există nici o pretenţie de drept de autor pe nici o parte din codul sursă de bază. (Documentarea şi codul test sunt o altă problemă - unele secţiuni din documentaţie şi logică testelor sunt guvernate de licenţe open-source.) Toţi contribuabilii la core-ul SQLite au semnat cum că nu au nici un interes de drept de autor asupra codului. Această înseamnă că oricine este capabil să facă orice vrea cu codul sursă SQLite (legal).

Sunt alte motoare de baze de date SQL cu licenţe liberale care permit ca, codul să fie extins şi liber folosit, dar acele alte motoare sunt încă guvernate de legea dreptului de autor. SQLite este diferit în aceea că acea lege a dreptului de autor nu i se aplică.

Fişierele de cod sursă pentru alte baze de date SQL încep în mod normal cu un comentariu ce descrie drepturile tale de a copia, vedea sau modifică acel fişier. Codul sursă SQLite nu conţine nici o liceenta atât timp cât nu este guvernat de legea dreptului de autor. În schimbul unei licenţe codul sursă SQLite oferă o binecuvântare:

"Fie să faci bine şi nu rău

Fie să găseşti iertare pentru tine şi să ierţi pe alţii

Fie să împarţi liber, niciodată luând mai mult decât dai."
  • Extensiile de limbaj SQL

SQLite oferă un număr de îmbunătăţiri limbajului SQL ce nu le găseşti în mod obişnuit în alte motoare de baze de date. Cuvântul rezervat EXPLAIN şi alocarea tipului de date evident sunt specificate mai sus. SQLite de asemenea oferă declaraţii că REPLACE şi clauza ON CONFLICT care permite control asupra rezolvării conflictelor. SQLite suportă ATTACH şi DETACH, comenzi care permit ca mai multe baze de date independente să fie folosite în acelaşi query! SQLite defineşte API-uri care permit utilizatorului să adauge noi funcţii SQL secvenţe cumulate.

  • SQL înţeles de SQLite

Librăria SQLite implementează majoritatea limbajului SQL standard, însă omite nişte caracteristici timp ce adaugă altele, proprii, în acelaşi tinp. De asemenea oferă o listă de cuvinte cheie (rezervate limbajului).

SQLite în 5 minute

Aici afli ce faci pentru a începe să experimentezi SQLite fără a avea de citit sau configurat prea mult:

Downloadează codul

  • Ia o copie de program precompilat pentru maşina ta, sau o copie a surselor şi compileazale tu însuţi. Vizitează pagină de download pentru mai multe informaţii.

Creează o nouă bază de date

  • La un shell sau la fereastră DOS, introdu: "sqlite3 test.db". Această va creea o noua bază de date numită "test.db". (Poţi folosi şi alt nume dacă doreşti.)
  • Introdu comenzi SQL în fereastră pentru a creea şi popula noua bază de date.
  • Documentaţie adiţională este disponibilă aici.

Scrie programe care folosesc SQLite

Dedesubt este un simplu program TCL ce demonstrează cum să foloseşti interfaţa TCL pentru SQLite. Programul execută declaraţiile SQL transmise ca al doilea argument către baza de date definite de primul argument. Comenzile pentru a vizualiza pentru sunt comanda sqlite3 de pe linia 7 care deschide o bază de date SQLite şi creează o noua comandă TCL numită db€ pentru a accesa aceea bază de date, invocarea comenzii db pe linia 8 pentru a execută comenzile SQL în baza de date şi închiderea conexiunii cu baza de date pe ultima linie a scriptului.

#!/usr/bin/tclsh
if {$argc!=2} {
  puts stderr "Usage: %s DATABASE SQL-STATEMENT"
  exit 1
}
load /usr/lib/tclsqlite3.so Sqlite3
sqlite3 db [lindex $argv 0]
db eval [lindex $argv 1] x {
  foreach v $x(*) {
    puts "$v = $x($v)"
  }
  puts ""
}
db close

Dedesubt este un simplu program C care demonstrează cum să foloseşti interfaţa (mediul) C/C++ pentru SQLite. Numele unei baze de date este dat de primul argument şi al doilea argument este una sau mai multe declaraţii SQL pentru a fi executate în baza de date. Apelurile de funcţie la care trebuie să fi atent aici sunt apelul sqlite3_open() pe linia 19 care deschide baza de date, sqlite3_exec() pe linia 25 care execută comenzile SQL în baza de date şi sqlite3_close() pe linia 30 care închide conexiunea cu baza de date.

#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}
int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;
  if(argc != 3){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    exit(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if(rc != SQLITE_OK){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

Versiunea 3.0 a SQLite

Versiunea 3.0 a SQLite introduce schimbări importante în librărie, incluzând:

  • Un format mai compact pentru fişierele bazei de date.
  • Acordarea tipului de date actual şi suportul pentru BLOB.
  • Suport pentru text UTF-8 şi UTF-16
  • Secvenţe de colatare text definite de utilizator.
  • ROWID-uri pe 64-bit.
  • Concurenţă îmbunătăţită.

Tipuri de date în versiunea 3.0 a SQLite

Versiunea 2 a SQLite stochează toate vlorile coloanelor că text ASCII. Versiunea 3.0 îmbunătăţeşte această prin oferirea capacităţii de a stoca numerele întregi şi numerele reale într-un format mai compact şi capabilitatea de a stoca date BLOB.

Fiecare valoare stocată în o bază de date SQLite (sau manipulate de motorul de baze de date) are una din urmatoareale clase de stocare:

  • NULL. Valoarea este o valoare NULL.
  • INTEGER. Valoarea este un întreg cu semn, stocat în 1,2,3,4,6 sau 8 octeţi depinzând de mărimea valorii.
  • REAL. Valoarea este o valoare cu virgule, stocată că un număr IEEE pe 8-octet, cu virgulă.
  • TEXT. Valoarea este un şir de caractere, stocat folosind codificarea bazei de date (UTF-8, UTF-16-BE sau UTF-16-LE).
  • BLOB. Vloarea este un blob de date, stocat exact cum a fost introdus.

Că şi în SQLite versiunea 2, orice coloană a unei baze de date versiunea 3.0, cu excepţia coloanei INTEGER PRIMARY KEY, pot fi folosite pentru a stoca orice tip de valoare.

Toate valorile date lui SQLite, fie că sunt literali încorporaţi în declaraţii SQL sau valori legate de declaraţii SQL precompilate sunt atribuite unei clase de stocare înainte că declaraţia SQL să fie executată. În condiţiile de mai jos, motorul de baze de date poate converti valorile între clasele de stocare numerice (INTEGER sau REAL) şi TEXT în timpul execuţiei query-urilor.

Clasele de stocare sunt iniţial atribuite după cum urmează:

  • Valorile specificate că literali că o parte a declaraţiilor SQL sunt atribuite clasei de stocare TEXT dacă sunt între ghilimele simple sau duble, INTEGER dacă literalul este specificat că un număr fără ghilimele fără punct zecimal sau exponent, REAL dacă literalul este un număr fără ghilimele cu un punct zecimal sau exponent şi NULL dacă valoarea este NULL. Literalii cu, clasă de stocare BLOB sunt specificaţi folosind notaţia X'ABCD'.
  • Valorile furnizate folosind API-uri sqlite3_bind_* sunt atribuite clasei de stocare care se potriveşte cel mai aproape de graniţele tipului native (ex. sqlite3_bind_blob() leagă o valoare de clasă de stocare BLOB).

Clasă de stocare a unei valori care este rezultatul unui operator scalar SQL depinde de cel mai de la margine operator al expresiei. Funcţii definite-utilizator pot întoarce valori cu orice clasă de stocare. Nu este în general posibil să se determine clasă de stocare a rezultatului a unei expresii în timpul compilării.

Bibliografie

SQLite Site-ul oficial SQLite