SQLite - Perl

In questo capitolo imparerai come usare SQLite nei programmi Perl.

Installazione

SQLite3 può essere integrato con Perl utilizzando il modulo Perl DBI, che è un modulo di accesso al database per il linguaggio di programmazione Perl. Definisce un insieme di metodi, variabili e convenzioni che forniscono un'interfaccia database standard.

Di seguito sono riportati semplici passaggi per installare il modulo DBI sulla macchina Linux / UNIX:

$ wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.625.tar.gz
$ tar xvfz DBI-1.625.tar.gz
$ cd DBI-1.625
$ perl Makefile.PL
$ make
$ make install

Se è necessario installare il driver SQLite per DBI, è possibile installarlo come segue:

$ wget http://search.cpan.org/CPAN/authors/id/M/MS/MSERGEANT/DBD-SQLite-1.11.tar.gz
$ tar xvfz DBD-SQLite-1.11.tar.gz
$ cd DBD-SQLite-1.11
$ perl Makefile.PL
$ make
$ make install

API dell'interfaccia DBI

Di seguito sono riportate importanti routine DBI, che possono essere sufficienti per lavorare con il database SQLite dal programma Perl. Se stai cercando un'applicazione più sofisticata, puoi consultare la documentazione ufficiale di Perl DBI.

Sr.No. API e descrizione
1

DBI->connect($data_source, "", "", \%attr)

Stabilisce una connessione al database, o sessione, alla $ data_source richiesta. Restituisce un oggetto handle di database se la connessione riesce.

L'origine dati ha la forma come: DBI:SQLite:dbname = 'test.db'dove SQLite è il nome del driver SQLite e test.db è il nome del file di database SQLite. Se il nome del file è dato come':memory:', creerà un database in memoria nella RAM che dura solo per la durata della sessione.

Se il nome del file è il nome del file del dispositivo effettivo, tenta di aprire il file del database utilizzando il suo valore. Se non esiste alcun file con quel nome, viene creato un nuovo file di database con quel nome.

Il secondo e il terzo parametro vengono mantenuti come stringhe vuote e l'ultimo parametro deve passare vari attributi come mostrato nell'esempio seguente.

2

$dbh->do($sql)

Questa routine prepara ed esegue una singola istruzione SQL. Restituisce il numero di righe interessate o undef in caso di errore. Un valore restituito di -1 significa che il numero di righe non è noto, non applicabile o non disponibile. Qui, $ dbh è un handle restituito dalla chiamata DBI-> connect ().

3

$dbh->prepare($sql)

Questa routine prepara un'istruzione per l'esecuzione successiva dal motore di database e restituisce un riferimento a un oggetto handle dell'istruzione.

4

$sth->execute()

Questa routine esegue qualsiasi elaborazione necessaria per eseguire l'istruzione preparata. Se si verifica un errore, viene restituito un undef. Un'esecuzione riuscita restituisce sempre true indipendentemente dal numero di righe interessate. Qui $ sth è un handle di istruzione restituito dalla chiamata $ dbh-> prepare ($ sql).

5

$sth->fetchrow_array()

Questa routine recupera la riga di dati successiva e la restituisce come un elenco contenente i valori del campo. I campi nulli vengono restituiti come valori undef nell'elenco.

6

$DBI::err

È equivalente a $ h-> err, dove $ h è uno dei tipi di handle come $ dbh, $ sth o $ drh. Restituisce il codice di errore del motore di database nativo dall'ultimo metodo del driver chiamato.

7

$DBI::errstr

Questo è equivalente a $ h-> errstr, dove $ h è uno qualsiasi dei tipi di handle come $ dbh, $ sth o $ drh. Ciò restituisce il messaggio di errore del motore di database nativo dall'ultimo metodo DBI chiamato.

8

$dbh->disconnect()

Questa routine chiude una connessione al database precedentemente aperta da una chiamata a DBI-> connect ().

Connetti al database

Il seguente codice Perl mostra come connettersi a un database esistente. Se il database non esiste, verrà creato e infine verrà restituito un oggetto database.

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite"; 
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) 
   or die $DBI::errstr;

print "Opened database successfully\n";

Ora, eseguiamo il programma sopra per creare il nostro database test.db nella directory corrente. Puoi cambiare il tuo percorso secondo le tue esigenze. Mantieni il codice sopra nel file sqlite.pl ed eseguilo come mostrato di seguito. Se il database è stato creato correttamente, verrà visualizzato il seguente messaggio:

$ chmod +x sqlite.pl
$ ./sqlite.pl
Open database successfully

Crea una tabella

Il seguente programma Perl viene utilizzato per creare una tabella nel database creato in precedenza.

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
   or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(CREATE TABLE COMPANY
   (ID INT PRIMARY KEY     NOT NULL,
      NAME           TEXT    NOT NULL,
      AGE            INT     NOT NULL,
      ADDRESS        CHAR(50),
      SALARY         REAL););

my $rv = $dbh->do($stmt);
if($rv < 0) {
   print $DBI::errstr;
} else {
   print "Table created successfully\n";
}
$dbh->disconnect();

Quando il programma sopra viene eseguito, creerà la tabella AZIENDA nel tuo test.db e mostrerà i seguenti messaggi:

Opened database successfully
Table created successfully

NOTE - Nel caso in cui visualizzi il seguente errore in una qualsiasi delle operazioni -

DBD::SQLite::st execute failed: not an error(21) at dbdimp.c line 398

In tal caso, apri dbdimp.c file disponibile nell'installazione di DBD-SQLite e scoprilo sqlite3_prepare() funzione e cambia il suo terzo argomento in -1 invece di 0. Infine, installa DBD :: SQLite usando make e fai make install per risolvere il problema.

Operazione INSERT

Il seguente programma Perl mostra come creare record nella tabella COMPANY creata nell'esempio precedente.

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
   or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (1, 'Paul', 32, 'California', 20000.00 ));
my $rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (2, 'Allen', 25, 'Texas', 15000.00 ));
$rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (3, 'Teddy', 23, 'Norway', 20000.00 ));

$rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 ););

$rv = $dbh->do($stmt) or die $DBI::errstr;

print "Records created successfully\n";
$dbh->disconnect();

Quando il programma sopra viene eseguito, creerà i record dati nella tabella AZIENDA e visualizzerà le seguenti due righe:

Opened database successfully
Records created successfully

Operazione SELECT

Il seguente programma Perl mostra come recuperare e visualizzare i record dalla tabella COMPANY creata nell'esempio precedente.

#!/usr/bin/perl

use DBI;
use strict;

my $driver = "SQLite";
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
   or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt );
my $rv = $sth->execute() or die $DBI::errstr;

if($rv < 0) {
   print $DBI::errstr;
}

while(my @row = $sth->fetchrow_array()) {
      print "ID = ". $row[0] . "\n";
      print "NAME = ". $row[1] ."\n";
      print "ADDRESS = ". $row[2] ."\n";
      print "SALARY =  ". $row[3] ."\n\n";
}
print "Operation done successfully\n";
$dbh->disconnect();

Quando il programma precedente viene eseguito, produrrà il seguente risultato.

Opened database successfully
ID = 1
NAME = Paul
ADDRESS = California
SALARY =  20000

ID = 2
NAME = Allen
ADDRESS = Texas
SALARY =  15000

ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY =  20000

ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY =  65000

Operation done successfully

Operazione UPDATE

Il seguente codice Perl mostra come aggiornare l'istruzione UPDATE per aggiornare qualsiasi record e quindi recuperare e visualizzare i record aggiornati dalla tabella COMPANY.

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
   or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(UPDATE COMPANY set SALARY = 25000.00 where ID=1;);
my $rv = $dbh->do($stmt) or die $DBI::errstr;

if( $rv < 0 ) {
   print $DBI::errstr;
} else {
   print "Total number of rows updated : $rv\n";
}
$stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt );
$rv = $sth->execute() or die $DBI::errstr;

if($rv < 0) {
   print $DBI::errstr;
}

while(my @row = $sth->fetchrow_array()) {
      print "ID = ". $row[0] . "\n";
      print "NAME = ". $row[1] ."\n";
      print "ADDRESS = ". $row[2] ."\n";
      print "SALARY =  ". $row[3] ."\n\n";
}
print "Operation done successfully\n";
$dbh->disconnect();

Quando il programma precedente viene eseguito, produrrà il seguente risultato.

Opened database successfully
Total number of rows updated : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY =  25000

ID = 2
NAME = Allen
ADDRESS = Texas
SALARY =  15000

ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY =  20000

ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY =  65000

Operation done successfully

Operazione DELETE

Il seguente codice Perl mostra come utilizzare l'istruzione DELETE per eliminare qualsiasi record e quindi recuperare e visualizzare i record rimanenti dalla tabella COMPANY -

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
   or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(DELETE from COMPANY where ID = 2;);
my $rv = $dbh->do($stmt) or die $DBI::errstr;

if( $rv < 0 ) {
   print $DBI::errstr;
} else {
   print "Total number of rows deleted : $rv\n";
}

$stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt );
$rv = $sth->execute() or die $DBI::errstr;

if($rv < 0) {
   print $DBI::errstr;
}

while(my @row = $sth->fetchrow_array()) {
      print "ID = ". $row[0] . "\n";
      print "NAME = ". $row[1] ."\n";
      print "ADDRESS = ". $row[2] ."\n";
      print "SALARY =  ". $row[3] ."\n\n";
}
print "Operation done successfully\n";
$dbh->disconnect();

Quando il programma precedente viene eseguito, produrrà il seguente risultato.

Opened database successfully
Total number of rows deleted : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 25000

ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000

ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000

Operation done successfully