perl bazy cgi

13
http://kt.agh.edu.pl/~wydrych/

Upload: pawel-gawronski

Post on 24-Jun-2015

52 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Perl Bazy Cgi

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

Page 2: Perl Bazy Cgi

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

Page 3: Perl Bazy Cgi

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

Page 4: Perl Bazy Cgi

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

Page 5: Perl Bazy Cgi

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

Page 6: Perl Bazy Cgi

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

Page 7: Perl Bazy Cgi

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

Page 8: Perl Bazy Cgi

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

Page 9: Perl Bazy Cgi

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

Page 10: Perl Bazy Cgi

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

Page 11: Perl Bazy Cgi

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

Page 12: Perl Bazy Cgi

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

Page 13: Perl Bazy Cgi

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