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