Vous êtes sur la page 1sur 13

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

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;

 adres ¹ródªa danych zaczynaj¡cy


si¦ od ,
$data_source

np. .
dbi:STEROWNIK:
dbi:mysql:database=mydb:host=sunum
i  nazwa u»ytkownika i hasªo.
 wªa±ciwo±ci poª¡czenia:
$user $auth
\%attr
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);

zwraca referencj¦ do tablicy


referencji.
fetchall_arrayref

$slice wybiera format wierszy (referencja do


tablicy lub hasha) oraz ogranicza pobierane
kolumny.
zwraca referencj¦ do hasha
referencji do hashy.
fetchall_hashref

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 T
defined

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

Vous aimerez peut-être aussi