Dost p do baz danych Piotr Wydrych http://kt.agh.edu.pl/~wydrych/ Wydziaª Elektrotechniki, Automatyki, Informatyki i Elektroniki Katedra Telekomunikacji 14 maja 2009 1/42
DBI podstawowe informacje DataBase Interface. Standardowy interfejs dost pu do bazy danych niezale»ny od systemu zarz dzania relacyjn baz danych. 5/42
DBD DataBase Driver. Niezale»ne sterowniki do poszczególnych systemów (baz danych). Przykªadowo: DBD::mysql, DBD::Oracle, DBD::Pg. Obecnie (listopad 2008) okoªo 200 ró»nych dost pnych do pobrania z CPAN. 6/42
Zasada dziaªania DBI ródªo: Alligator Descartes, Tim Bunce: Programming the Perl DBI. O'Reilly, 2000. ISBN 1-56592-699-4. 7/42
Sk d wzi DBI i DBD Niektóre systemy operacyjne instaluj DBI razem z Perlem. Debian, Ubuntu pakiety libdbi-perl oraz libdbd- -perl. FreeBSD, OpenBSD p5-dbi oraz p5-dbd-. Solaris CSWpmdbi oraz CSWpmdbd. Ogólnie dbi.perl.org. 8/42
Plik tekstowy Wady i zalety + Šatwo zinterpretowa goªym okiem. + Bez instalowania dodatkowych moduªów. Ka»dy skrypt musi zna dokªadn struktur danych. Utrudniona aktualizacja. Brak transakcji. Brak powi za«, kluczy obcych, zª cze«. 11/42
Plik tekstowy Przykªad struktury i operacji Przykªad root:x:0:0:super-user:/root:/bin/bash Dodawanie danych: open F, >> /etc/passwd and printf F %s:..., @user{login,...}; Pobieranie danych: open F, < /etc/passwd and %data = map { /(\w+):.../? ($1 => {uid => $2,...}) : () } <F>; Usuwanie, aktualizacja = pobranie + zapis caªo±ci. 12/42
Data::Dumper Wady i zalety. Przykªady operacji + Šatwo zinterpretowa goªym okiem. + Bez instalowania dodatkowych moduªów. + Šatwe zapisywanie i pobieranie danych. Wady jak dla zwykªego pliku. Zapisywanie danych: open D, > data.dump and print D Data::Dumper->Dump([$data], [ data ]); Pobieranie danych: open D, < data.dump and eval join, <D>; 14/42
DBI Wady i zalety Wady i zalety DBI wady i zalety baz danych. + Transakcje, zªo»enia, klucze, widoki itd. + Bezpiecze«stwo i wydajno±. Konieczno± instalowania dodatkowego oprogramowania... +... które cz sto i tak instalujemy! Wniosek use DBI; 16/42
connect Podª czanie do bazy danych $dbh = DBI->connect($data_source, $user, $auth) or die $DBI::errstr; $dbh = DBI->connect($data_source, $user, $auth, \%attr) or die $DBI::errstr; $data_source adres ¹ródªa danych zaczynaj cy si od dbi:sterownik:, np. dbi:mysql:database=mydb:host=sunum. $user i $auth nazwa u»ytkownika i hasªo. \%attr wªa±ciwo±ci poª czenia: Przykªadowo { PrintError => 0 }. Podstawowe w dokumentacji DBI. Peªna lista zale»na od u»ytego DBD. 19/42
Zapytania bez zwracania danych do $rows = $dbh->do($statement) or die $dbh->errstr; $rows = $dbh->do($statement, \%attr) or die $dbh->errstr; $rows = $dbh->do($statement, \%attr, @bind_values) or die $dbh->errstr; Przygotowuje i wykonuje zapytanie. Zwraca liczb wierszy (np. skasowanych). Nie nadaje si do zapyta«select. $statement zapytanie do wykonania. @bind_values je»eli zapytanie zawiera pytajniki, zamiast nich wstawiane s w bezpieczny sposób kolejne warto±ci z tablicy. 21/42
Zapytania bez zwracania danych Prosty przykªad Przykªad $sql = CREATE TABLE dbmss ( name VARCHAR(20) PRIMARY KEY, newest_version VARCHAR(20) NOT NULL, web_page VARCHAR(255) ); ; $dbh->do($sql) or die $dbh->errstr; 22/42
Zapytania bez zwracania danych Przykªad z wykorzystaniem @bind_values Przykªad $sql = UPDATE dbmss SET newest_version =? WHERE name =?; ; $dbh->do($sql, undef, 5.1, "MySQL ( C.Ed. )") or die $dbh->errstr; Rzeczywi±cie wykonane zapytanie UPDATE dbmss SET newest_version = 5.1 WHERE name = MySQL (\ C.Ed.\ ) ; 23/42
Zapytania z pobieraniem danych Dwie metody: z odr bnym przygotowaniem zapytania, bez odr bnego przygotowania zapytania (czyli ze zintegrowanym przygotowaniem). 25/42
Przygotowywanie zapytania prepare $sth = $dbh->prepare($statement) or die $dbh->errstr; $sth = $dbh->prepare($statement, \%attr) or die $dbh->errstr; Przygotowuje zapytanie do pó¹niejszego (by mo»e wielokrotnego) wykonania. Zwraca uchwyt do przygotowanego zapytania. $statement zapytanie do wykonania. 27/42
Wykonywanie przygotowanego zapytania execute $rv = $sth->execute or die $sth->errstr; $rv = $sth->execute(@bind_values) or die $sth->errstr; Rozpoczyna wykonywanie zapytania. Zwraca prawd je»eli zapytanie si powiodªo. Raz przygotowane zapytanie mo»na wykonywa wiele razy. Nie zwraca liczby wierszy...... poniewa» w momencie rozpocz cia wykonywania zapytania nie wiadomo ile ich b dzie! @bind_values u»ywane je»eli podczas przygotowywania zapytania u»yte zostaªy pytajniki. 28/42
Pobieranie danych W p tli while defined fetchrow_* $ary_ref = $sth->fetchrow_arrayref; $ary_ref = $sth->fetch; @ary = $sth->fetchrow_array; $hash_ref = $sth->fetchrow_hashref; $hash_ref = $sth->fetchrow_hashref($name); Zwracaj odpowiednio referencj do tablicy, tablic, referencj do hasha. Je»eli nie ma wi cej wierszy zwracaj warto± niezdeniowan. $name pozwala wybra wielko± liter w kluczach hasha. 29/42
Pobieranie danych W caªo±ci do pami ci fetchall_* $tbl_ary_ref = $sth->fetchall_arrayref; $tbl_ary_ref = $sth->fetchall_arrayref($slice); $tbl_ary_ref = $sth->fetchall_arrayref($slice, $max_rows); $hash_ref = $sth->fetchall_hashref($key_field); fetchall_arrayref zwraca referencj do tablicy referencji. $slice wybiera format wierszy (referencja do tablicy lub hasha) oraz ogranicza pobierane kolumny. fetchall_hashref zwraca referencj do hasha referencji do hashy. U»ywa $key_field jako klucza. 30/42
Zapytania z pobieraniem danych z odr bnym przygotowaniem zapytania prepare execute nowe warto±ci np. INSERT fetchall_* fetchrow_* N defined T 31/42
Zapytania z pobieraniem danych z odr bnym przygotowaniem zapytania przykªad prepare, execute, fetchrow $sth = $dbh->prepare( SELECT name, newest_version FROM dbmss WHERE name LIKE? ); $sth->execute( %SQL ) or die $sth->errstr; printf "%s %s\n", $ref->{name}, $ref->{newest_version} while $ref = $sth->fetchrow_hashref; 32/42
Zapytania z pobieraniem danych bez odr bnego przygotowania zapytania selectrow_* @ary = $dbh->selectrow_array($statement); @ary = $dbh->selectrow_array($statement, \%attr); @ary = $dbh->selectrow_array($statement, \%attr, @bind_values); $ary_ref = $dbh->selectrow_arrayref(...); $hash_ref = $dbh->selectrow_hashref(...); Pobiera jeden wiersz (jedn krotk ). prepare + execute + raz wykonane fetchrow_*. $statement mo»e by wcze±niej przygotowanym przez funkcj prepare zapytaniem. 34/42
Zapytania z pobieraniem danych bez odr bnego przygotowania zapytania selectcol_arrayref $ary_ref = $dbh->selectcol_arrayref($statement); $ary_ref = $dbh->selectcol_arrayref($statement, \%attr); $ary_ref = $dbh->selectcol_arrayref($statement, \%attr, @bind_values); Pobiera dane z jednej kolumny, ze wszystkich wierszy. prepare + execute + fetch w p tli. $statement mo»e by wcze±niej przygotowanym przez funkcj prepare zapytaniem. Atrybut Columns umo»liwia pobranie danych z innej ni» pierwsza kolumny, a tak»e z wi cej ni» jednej kolumny (nadal do jednej tabeli!) 35/42
Zapytania z pobieraniem danych bez odr bnego przygotowania zapytania selectall_* $ary_ref = $dbh->selectall_arrayref($statement); $ary_ref = $dbh->selectall_arrayref($statement, \%attr); $ary_ref = $dbh->selectall_arrayref($statement, \%attr, @bind_values); $hash_ref = $dbh->selectall_hashref($statement, $key_field); $hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr); $hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr, @bind_values); prepare + execute + fetchall_*. U»ywaj c atrybut Slice pozwala wybra format wierszy. 36/42
Dobre zwyczaje $sth->finish Informuje serwer,»e z danego zapytania nie b d pobierane ju»»adne dane. Tylko je»eli skrypt nie pobraª wszystkich krotek. $dbh->disconnect or warn $dbh->errstr Rozª cza poª czenie z baz danych. Je»eli AutoCommit jest wyª czone dziaªanie jest zale»ne od silnika bazy danych. Powinno zosta poprzedzone $dbh->commit lub $dbh->rollback. http://search.cpan.org/~timb/dbi/dbi.pm 38/42
Bibliograa T. Bunce. DBI - Database independent interface for Perl. http://search.cpan.org/~timb/dbi/dbi.pm. A. Descartes and T. Bunce. Programming the Perl DBI. O'Reilly, 2000. 39/42