Archiv pro rubriku: Perl

Nebojte se SQLite!

SQLite je transakční databázových systém, s nulovou konfigurací, bez serverové části, jednoduchý, kompaktní, lehký design, postavený nad souborovým systémem respektive souborem.

SQLiteLogo3

SQLite je velmi populární, né vždy je totiž nutné a hlavně možné nasadit plnohodnotný klient-server SQL server (Mariandb, Postgres) ale mít po ruce možnost a výhody sql nad souborem se často hodí (např. i v systému Android).

Ve své podstatě jde o implementaci relačního databázového systému a standardu SQL-92 realizovaného v jazyce C (mimochodem zajímavě napsaná knihovna s implementací objektů pomocí struktur, pointerů).

Architektura SQLite z francouzské wikipedie
Architektura SQLite z francouzské wikipedie

Velmi často se používá SQLite v jazyce Perl přes knihovnu DBI, ukažme si základní snippet ve kterém bude vše co je potřeba pro práci s touto databází.

  • připojení /connect
  • vytvoření tabulky /create
  • vložení záznamu / insert
  • vyhledání záznamu / search
  • úprava záznamu / update
  • smazání záznamu / delete

Instalace:

Debian, Ubuntu

root@havel-machine:~# apt-get install sqlite3 libdbd-sqlite3-perl

CentOS, Fedora or RHEL

root@havel-machine:~# yum install sqlite perl-DBD-SQLite

 

#!/usr/bin/perl
 
use DBI;
use strict;
 
my $driver   = "SQLite";
my $db_name = "sqlite.db";
my $dbd = "DBI:$driver:dbname=$db_name";
 
# sqlite nepoužívý jméno a heslo
my $username = "";
my $password = "";
 
# vytvoříme a připojíme se db
# zároveň dojte k vytvoření souboru databáze sqlite.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 }) or die $DBI::errstr;
 
# vytvoříme tabulku
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
             (ID INTEGER PRIMARY KEY     AUTOINCREMENT,
              HOSTNAME       TEXT    NOT NULL,
              OS             CHAR(50),
              CPULOAD        REAL););

# provedeme dotaz
my $ret = $dbh->do($stmt);

if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Tabulka vytvořena\n"; }

# vložíme řádky do tabulky
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD) 
           VALUES ('linux-01', 'Debian 8', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('linux-02', 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('windows-01', 'Windows Server 2012', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
# získání dat z tabulky a výpis
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);

my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; } while(my @row = $obj->fetchrow_array()) {
      print "ID: ". $row[0] . "\n";
      print "HOSTNAME: ". $row[1] ."\n";
      print "OS: ". $row[2] ."\n";
      print "CPULOAD: ". $row[3] ."\n\n";
}
 
# změna záznamu
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='CentOS 7';);

$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if( $ret < 0 ) { print STDERR $DBI::errstr; }
else { print STDERR "Aktualizováno $ret řádků\n"; }

# smazání
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Smazáno $ret řádků\n"; }

# Odpojení databáze
$dbh->disconnect();

 

Jak je vidět z příkladu použití je skutečně jednoduché a přímočaré, nebojte se ho vyzkoušet ve svých projektech, mnoho lidí do startu špatně odhadne požadavky a SQLite je tím pádem neprávem ignorováno jako něco podřadného, přejít na “vyšší” databáze z SQLite je triviální.

Knihovny (binding) existuje pro celou řadu programovacích jazyků kromě  uvedeného Perl, např. C/C++, Python, Lua, PHP, ale např. i Delphi a další.

SQLite není okrajový zapadlý projekt, je integrován přímo do systému Android pro uložení persistentních dat, používá ho iPhone nebo společnost Airbus ve svém software či firma Adobe, Bosh, Dropbox. (https://www.sqlite.org/famous.html)

SQLite používám rád, přemýšlejte o něm.

https://www.sqlite.org

František Havel