perl bazy cgi
TRANSCRIPT
Dost¦p do baz danych
Piotr Wydrych
http://kt.agh.edu.pl/~wydrych/
Wydziaª Elektrotechniki, Automatyki, Informatyki i ElektronikiKatedra Telekomunikacji
14 maja 2009
1/42
DBI � podstawowe informacje
DataBase Interface.
Standardowy interfejs dost¦pu do bazy danychniezale»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ó»nychdost¦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 razemz Perlem.
Debian, Ubuntu � pakiety libdbi-perl orazlibdbd-∗-perl.FreeBSD, OpenBSD � p5-DBI oraz p5-DBD-∗.Solaris � CSWpmdbi oraz CSWpmdbd∗.Ogólnie � dbi.perl.org.
8/42
Plik tekstowyWady 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 tekstowyPrzykª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::DumperWady 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
DBIWady i zalety
Wady i zalety DBI ≈ wady i zalety baz danych.
+ Transakcje, zªo»enia, klucze, widoki itd.
+ Bezpiecze«stwo i wydajno±¢.
� Konieczno±¢ instalowania dodatkowegooprogramowania . . .
+ . . . które cz¦sto i tak instalujemy!
Wniosek
use DBI;
16/42
Podª¡czanie do bazy danych
connect
$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¡cysi¦ 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óbkolejne warto±ci z tablicy.
21/42
Zapytania bez zwracania danychProsty 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 danychPrzykª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 zezintegrowanym 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»ewielokrotnego) 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 wykonywaniazapytania nie wiadomo ile ich b¦dzie!
@bind_values � u»ywane je»eli podczasprzygotowywania zapytania u»yte zostaªy pytajniki.
28/42
Pobieranie danychW 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±¢niezde�niowan¡.$name pozwala wybra¢ wielko±¢ liter w kluczachhasha.
29/42
Pobieranie danychW 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 tablicyreferencji.
$slice wybiera format wierszy (referencja dotablicy lub hasha) oraz ogranicza pobieranekolumny.
fetchall_hashref zwraca referencj¦ do hashareferencji do hashy.
U»ywa $key_field jako klucza.
30/42
Zapytania z pobieraniem danychz odr¦bnym przygotowaniem zapytania
prepare
execute
nowe warto±ci
fetchall_* fetchrow_*
defined
np. INSERT
TN
31/42
Zapytania z pobieraniem danychz 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 danychbez 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 przygotowanymprzez funkcj¦ prepare zapytaniem.
34/42
Zapytania z pobieraniem danychbez 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 wszystkichwierszy.prepare + execute + fetch w p¦tli.$statement mo»e by¢ wcze±niej przygotowanymprzez funkcj¦ prepare zapytaniem.Atrybut Columns umo»liwia pobranie danych z innejni» pierwsza kolumny, a tak»e z wi¦cej ni» jednejkolumny (nadal do jednej tabeli!)
35/42
Zapytania z pobieraniem danychbez 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¢ formatwierszy.
36/42
Dobre zwyczaje
$sth->finishInformuje 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->errstrRozª¡cza poª¡czenie z baz¡ danych.Je»eli AutoCommit jest wyª¡czone dziaªanie jestzale»ne od silnika bazy danych.Powinno zosta¢ poprzedzone $dbh->commit lub$dbh->rollback.
http://search.cpan.org/~timb/DBI/DBI.pm
38/42
Bibliogra�a
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