Moduł DBI

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Moduł DBI - Database independent interface for Perl

Wstęp

Moduł DBI umożliwia dostęp do interfejsów baz danych w Perlu. Ciekawostką jest to ze można za jego pomocą korzystać z kilku systemów bazodanowych. Przykładowo na mancie dostępne są: DBM, ExampleP, File, Pg, Proxy, SQLite, SQLite2, Sponge, mysql, ich listę można uzyskać poleceniem: use DBI; @tablica = DBI->available_drivers; print "@tablica\n";

W moich przykładach stosuję ogólno przyjętą konwencję:
$dbh - jest uchwytem do bazy danych
$sth - jest uchwytem do (wyniku) zapytania

Tworzenie połączenia z bazą danych: mysql

Aby można było używać modułu należy oczywiście go załadować za pomocą komendy use DBI;. Łączenie odbywa sie podobnie jak w PHP, poprzez utworzenie uchwytu do połączenia, w naszym przypadku jest nim: $dbh. Przykład połączenia z bazą będącą na naszym komputerze:

use DBI; $dbh = DBI->connect( 'DBI:mysql:nazwa_bazy', 'uzytkownik', 'haslo' ) || die "Nie połączyłem: $DBI::errstr"; # ... tu jakieś zapytania do bazy $dbh->disconnect();

Przykład połączenia z bazą będąca na komputerze zdalnym (dodajemy tylko parametr host=):

use DBI; $dbh = DBI->connect( 'DBI:mysql:nazwa_bazy;host=adres.hosta.gda.pl', 'uzytkownik', 'haslo' ) || die "Nie połączyłem: $DBI::errstr"; ... $dbh->disconnect();

Od razu da się zauważyć specyficzny sposób podawania nazwy bazy danych, możliwości jest kilka: dbi:DriverName:nazwa_bazy dbi:DriverName:nazwa_bazy@adres.hosta.gda.pl:port dbi:DriverName:database=nazwa_bazy;host=adres.hosta.gda.pl;port=port

Wykonywanie zapytań SQL

W przypadku prostych zapytań, które nie zwracają zbyt wielu wartości można stosować $dbh->do(). Nie powinno się jej używać do zapytań typu: SELECT, ponieważ nie zwraca ona 'uchwytu' do wyników.

$dbh->do('CREATE TABLE tabela (id INT, val VARCHAR(100) ) '); $dbh->do('INSERT INTO tabela VALUES(1, "aaa")'); $c = $dbh->do('DELETE FROM tabela WHERE id=1'); print "Usunalem $c wierszy\n";

W przypadku zapytań typu SELECT najwygodniej uzywać $dbh->prepare() oraz $sth->execute() (przynajmniej na początku, gdy uczysz się pracy z modułem DBI): $sth = $dbh->prepare('SELECT val FROM tabela WHERE id=1'); $sth->execute(); Działa to tak, że zapytanie do bazy zostaje najpierw "przygotowane" i wtedy zwrócona jest z uchwytu nowa forma obiektu bazy, która umie wykonać operację execute. I w dogodnej chwili można takie execute wykonać. Operacja prepare może być wykonana wiele razy dla różnych zapytań, za każdym razem zwracając nowy uchwyt. Można je przechowywać i wykonywać potem wielokrotnie, o ile ma to oczywiście sens.

Wynik operacji na bazie danych to najczęściej strumień różnych danych. Możemy przerobić go na tablicę za pomocą $sth->fetchrow_array() lub na hash za pomocą fetchrow_hashref(). Każda z tych operacji zwraca gotową strukturę danych - albo tablicę albo referencję do hasza. Oczywiście takich funkcji jest dużo więcej, i warto poczytać w dokumentacji o nich, gdyż mogą się czasami przydać "bardziej" niż te przedstawione tutaj: $sth = $dbh->prepare('SELECT val FROM tabela WHERE id=1'); $sth->execute(); $wynikH = $sth->fetchrow_hashref(); print "Zwrócono wartość: $wynikH->{val} \n"; @wynikT = $sth->fetchrow_array(); print "Zwrócono wartość: $wynikT[0] \n";

Aby wyświetlić więcej wierszy z wyniku zapytania można stosować kolejne odbieranie danych w pętli (każda odebrana tablica odpowiada jednemu 'wierszowi' danych z bazy):

while ( my @wiersz = $sth->fetchrow_array ) { print "@wiersz\n"; }

Przykładowy program

Prosty program korzystający z bazy danych. Rzuć na niego okiem i spróbuj zorientować się co wykonuje :) #!/usr/bin/perl use DBI; use Data::Dumper; $dbh = DBI->connect("DBI:mysql:tab","jestem","gupi"); $dbh->do('CREATE TABLE tabela (id INT, val VARCHAR(100) ) '); $dbh->do('INSERT INTO tabela VALUES(1, "aaaa" )'); $dbh->do('INSERT INTO tabela VALUES(2, "bbbb" )'); $sth = $dbh->prepare('SELECT * FROM tabela WHERE id=1'); $sth->execute(); $wynikH = $sth->fetchrow_hashref(); print "HASH:"; print Dumper \$wynikH; $sth = $dbh->prepare('SELECT * FROM tabela WHERE id=2'); $sth->execute(); @wynikT = $sth->fetchrow_array(); print "TAB:"; print Dumper \@wynikT; $sth->finish(); $dbh->disconnect();

Program wyswietli:

HASH:$VAR1 = \{ 'val' => 'aaaa', 'id' => '1' }; TAB:$VAR1 = [ '2', 'bbbb' ];

Dokumentacja

Pozostałe szczegóły są opisane w dokumentacji modułu, można je wyświetlić wpisując polecenie man DBI lub w internecie http://cpan.uwinnipeg.ca/htdocs/DBI/DBI.html.

Autor opracowania

Ł.K.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.