Moduł DBI
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaModuł 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.