|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Perl (80) - Databáze - závěrečné poznámkyUvedeme několik poznámek o dalších možnostech při práci s databázemi a o tom, co by mohlo působit problémy a je na to třeba dávat pozor.
Rychlý výpis výsledků pro účely laděníPokud potřebujeme výsledky SELECT dotazu pouze zobrazit, aniž bychom je chtěli dále upravovat, je zde k dispozici metoda dump_results. Užívá se zejména pro testování dotazů. Po jejím zavolání jsou vypsána na určený výstup získaná data v nějakém daném formátu. Volání metody dump_results vypadá následovně.
$pocet_radku = $dbh->dump_results($max_delka_hodnoty, $oddelovac_radku, $oddelovac_hodnot, $ovladac);
Žádný parametr však není povinný. Ve zdrojovém kódu pak pro výpis stačí uvést například toto.
Problémy s uvozením v dotazechNyní narážíme na potenciální problém, který nastane v okamžiku, kdy do podmínky dotazu budeme chtít zahrnout řetězec. Pro začátek se podívejme na tento řádek.
my $sth = $dbh->prepare("SELECT * FROM tabulka WHERE description='$popis'");
Zde musíme opravdu vědět, co za dotaz to vlastně databázi posíláme. Co když se uvnitř proměnné zahrnuté do dotazu vyskytuje nějaký apostrof? Co když v $popis bude například hodnota získaná z formuláře na webu od nějakého návštěvníka a bude mít hodnotu"neco' or vyhra='ano"? Proti takovému obsahu je nutno se bránit. V proměnné v dotazu může být obecně cokoliv a proto knihovna DBI pro ošetření nebezpečných dat nabízí vlastní metodu. Metoda quote nahradí v zadaném řetězci podle kritérií použitého databázového systému citlivé znaky escape sekvencemi. Problém tedy vyřešíme, když kód přepíšeme do nové podoby.
MetadataDBI nabízí několik metod pro získávání dat, která popisují jiná data. V našem případě jde například o informace o tabulkách, sloupcích, klíčích apod. Jen pro představu uveďme, jak se s takovými metodami pracuje. Ukážeme si metodu table, která po zavolání nad ovladačem databáze vrací tabulky v ní obsažené.
print "Tabulka: $_\n" for $dbh->tables;
Detailnější informace o tabulkách nabízí metoda table_info. Existují i další podobné metody s názvem většinou končícím na _info. Více informací lze nalézt v dokumentaci. TrasováníPokud nám něco dělá při práci s databází neplechu a potřebujeme to vypátrat, může pomoci trasovací režim. Pomocí něj můžeme sledovat všechny operace provedené s DBI. Trasovací režim se zapíná metodou trace nad ovladačem databáze nebo jiným objektem. Jako argument tato metoda přijímá trasovací mód (0 vypíná trasování, nebo 1-5 pro rozsah zobrazovaných informací vzestupně) a jméno souboru, kam se trasovací informace budou zapisovat.
$dbh->trace(2, "dbitrace.log");
Většina řádků v dbitrace.log začíná šipkou. Směr -> označuje to, co bylo metodám předáno, opačná znázorňuje to, co jimi bylo vráceno. Přidávání záznamůPoužití prepare a execute je výhodné také při mnohanásobném volání příkazu INSERT. Jako příklad si můžeme uvést konverzi dat ze zdroje do následující tabulky.
Ve zdroji budou řádky ve formátu
sloupec1:sloupec2:sloupec3
A následující program naplní tabulku daty ze zdroje. Nejdříve příkazem split rozdělíme řádek na jednotlivé hodnoty a výsledný seznam předáme metodě execute. $sth = $dbh->prepare("INSERT INTO tabulka (sloupec1, sloupec2, sloupec3) VALUES (?, ?, ?)"); while(<DATA>){ chomp; $sth->execute(split /:/); } Podpora transakcíDBI podporuje transakční zpracování dotazů. Podmínkou k tomu samozřejmě je, aby transakce podporoval i databázový systém (to znamená, že funkčnost závisí na ovladači). Problémy tak mohou nastat například u starších verzí MySQL. Jsou dvě možnosti jak aktivovat transakční zpracování. Buď vypnout atribut AutoCommit nebo zavolat metodu begin_work.
$dbh->begin_work;
Dále můžeme například vkládat záznamy a kontrolovat, zda všechny dopadly v pořádku. Pokud jsme nakonec spokojeni s výsledkem, transakci potvrdíme a všechny změny se tak promítnou. Potvrzení provedeme metodou commit a v případě neúspěchu akce odvoláme pomocí rollback. Obě metody jsou volány nad ovladačem databáze, nikoliv dotazu. Správnost všech dotazů ověříme podmínkou, která bude logickou spojkou AND spojovat všechna volání metody execute. V případě, že nenulový počet volání selže (to jest selže alespoň jedno), podmínka bude mít hodnotu false. Toto lze provést například tímto způsobem.
DBI shellJako zajímavost na závěr stojí za zmínku databázový klient DBI::shell (příkaz dbish), který pracuje s databázemi stejně jako DBI. Více informací o něm je v dokumentaci.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |