Tartalomjegyzék

< Adatbázis-kezelés

SQLite adatbázisok

Bevezetés

Az SQLite egyszerű állomány alapú adatbázis-kezelési lehetőséget nyújt. Egy adatbázis egy állomány. Nincs hálózati elérés, nincs jogosultság kezelés. Ma már szinte minden programozási nyelvben támogatott, így használata jó választás lehet. Nem sok típust támogat, kisebb projektek megfelelő adattárolója lehet, az egyszerűség jellemzi.

Telepítés

apt install sqlite3

Telepíthető dokumentáció:

apt install sqlite3-doc

Használat

Parancssorba egyszerűen írjuk be az sqlite3 parancsot. A parancs indítása után:

janos@iskolazo:~$ sqlite3 
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

A parancsok „.” karakterrel kezdődnek. Néhány parancs:

Az SQLite fájlokat .db kiterjesztéssel szokás ellátni, bár ez nem kötelező.

Az sqlite3 indításakor az adatbázis megadható:

sqlite3 kekzrt.db

Ha az adatbázis nem létezik automatikusan nem jön létre. A megnyitó parancs hatására viszont létrejön:

sqlite> .open kekzrt.db

Ezek után kiléphetünk és megnézhetjük az eredményt.

sqlite> .open kekzrt.db
sqlite> .quit
janos@iskolazo:~$ ls

A .show parancs megmutatja a megnyitott állományt és a hozzátartozó alapértékeket.

Az SQLite típusok

Típus Leírás
NULL NULL érték
INTEGER egész szám
REAL valós számok
TEXT szöveg a következő kódolással: UTF-8, UTF-16BE vagy UTF-16LE
BLOB pontosan tárolt adatok

Az SQLite persze elfogad int, varchar és hasonló típusokat, amelyeket átkonvertál. Tehát írhatunk ilyen utasításokat is:

sqlite> create table t1(a int, b varchar(100));

Tábla létrehozása

sqlite> create table dolgozok (
   ...> id int primary key,
   ...> nev text,
   ...> telepules text);
sqlite> 

Az utasítások több sorba is írhatók. Az utasítás végét mindig „;” karakterrel jelezzük.

A táblák megtekintése:

sqlite> .tables
dolgozok
sqlite>

A táblák felépítése:

sqlite> .schema
CREATE TABLE dolgozok (
id int primary key,
nev text,
telepules text);
sqlite>

Ha több táblánk is van, de csak a dolgozók táblát szeretnénk:

sqlite> .schema dolgozok
CREATE TABLE dolgozok (
id int primary key,
nev text,
telepules text);
sqlite>

Ha az azonosítót automatikusan emelni szeretnénk integer típust kell használnunk:

sqlite> create table dolgozok (
   ...> id integer primary key autoincrement,
   ...> nev text,
   ...> telepules text,
   ...> szuletes text);
sqlite> 

SQL

SQL példák:

sqlite> insert into dolgozok values  (1, "Nagy János", "Szolnok");
sqlite> select * from dolgozok;

Megadható az INSERT számára milyen mezőket adunk meg:

sqlite> insert into dolgozok (nev, telepules) values  ("Nagy János", "Szolnok");

A SET kulcsszó itt nem használható.

Adatok módosítása:

sqlite> update dolgozok set telepules="Szeged" where id=2;

Rekord törlése:

sqlite> delete from dolgozok where id=2;

A kimenet formázása

A select parancs kimenetében az oszlopok pipe karakterrel vannak tagolva. Ezen változtathatunk, a .mode column paranccsal:

sqlite> select * from dolgozok;
1|Nagy János|Szolnok
2|Poros Mária|Szeged
3|Fényes Gábor|Szolnok
sqlite> .mode column
sqlite> select * from dolgozok;
1           Nagy János  Szolnok
2           Poros Mári  Szeged
3           Fényes Gá  Szolnok
sqlite> 

Hátránya, hogy levágja azokat a karaktereket, amelyek nem férnek ki. Természetesen beállítható az oszlop szélessége:

sqlite> .width 3 16 10
sqlite> select * from dolgozok;
1    Nagy János       Szolnok
2    Poros Mária      Szeged
3    Fényes Gábor    Szolnok
sqlite>

Fejléc bekapcsolása:

sqlite> .header on
sqlite> select * from dolgozok;
id   nev              telepules
---  ---------------  ------------
1    Nagy János      Szolnok
2    Poros Mária     Szeged
3    Fényes Gábor   Szolnok
sqlite>

Fejléc kikapcsolása:

sqlite> .header off

Visszakapcsolás az eredeti módba:

sqlite> .mode list

A list módban beállítható a szeparátor a .separator paranccsal:

sqlite> .mode list
sqlite> select * from dolgozok;
1|Nagy János|Szolnok
2|Poros Mária|Szeged
3|Fényes Gábor|Szolnok
sqlite> 
sqlite> .separator ", "
sqlite> select * from dolgozok;
1, Nagy János, Szolnok
2, Poros Mária, Szeged
3, Fényes Gábor, Szolnok
sqlite>
A .mode összes parancsa
Parancs Leírás
ascii mezők/sorok 0x1F és 0x1E szeparátorral
csv vesszővel szeparált értékek
column balra igazított mezők (lásd még a .width)
html HTML <table> kód
insert SQL insert állítás táblához
line egy érték per sor
list értékek a .separator szöveggel tagolva
quote idézőjeles, veszővel szeparálva
tabs tabulátorral tagolt
tcl TCL elemek listája

Írás fájlba

Írás egyszer:

sqlite> .once adat.txt
sqlite> select * from dolgozok;

A következő SQL utasítás az adat.txt fájlba íródik. Az újabb SQL utasítások kimenete már a képernyőre íródik.

Írás folyamatosan fájlba:

squlite> .output adat.txt
squlite> select nev from dolgozok;
squlite> select telepules from dolgozok;

Minden SQL utasítás kimenete az adat.txt fájlba megy. A második és a többi utasítás kimenete hozzáfűződik az adat.txt fájl végéhez.

Ha szeretnénk újra a képernyőre irányítani a kimenetet, akkor írjuk be paraméter nélkül a .output parancsot:

sqlite> .output
sqlite> select nev from dolgozok;
Nagy János
Poros Mária
Fényes Gábor
sqlite> 

Függelék

Grafikus felület

A grafikus felületet ugyan nem itt tárgyaljuk, de említésre méltó egy program:

apt install sqlitebrowser

PHP

PHP5 modul telepítése:

# apt install php5-sqlite

C nyelv

Telepítjük a szükséges csomagot:

# apt install libsqlite3-dev

Írjunk egy egyszerű csomagot:

main.c
#include <stdio.h>
#include <sqlite3.h>
 
static int callback(void *NotUsed, int rekordSzam, char **mezoErtek, char **mezo) {
	int i;	
	for(i=0; i<rekordSzam; i++) {
		printf("%s: %s \n", mezo[i], mezoErtek[i] ? mezoErtek[i] : "NULL");
	}
	printf("\n");
	return 0;
}
 
int main() {
	sqlite3 *db;
	int rc;
	char *zErrMsg = 0;
 
	//Ha az adatbázis nem létezik, létrehozza
	rc = sqlite3_open("kekzrt.db", &db);
	if(rc) {
		fprintf(stderr, "Az adatbázist nem tudom megnyitni: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return(1);
	}
 
	rc = sqlite3_exec(db, "select * from dolgozok", callback, 0, &zErrMsg);
	if(rc != SQLITE_OK) {
		fprintf(stderr, "SQL hiba: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);
	}
	sqlite3_close(db);
}

Fordítás:

gcc -l sqlite3 -o main main.c

Futtatás:

./main

Források