LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (80) - Databáze - závěrečné poznámky

Perl Uvedeme 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.

1.6.2009 01:00 | Jiří Václavík | Články autora | přečteno 8874×

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.

my $sth = $dbh->prepare("SELECT * FROM tabulka");
$sth->execute();
my $rows = $sth->dump_results(15, "\n", "\t");

Problémy s uvozením v dotazech

Nyní 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.

my $quoted = $dbh->quote($popis);
my $sth = $dbh->prepare("SELECT * FROM tabulka WHERE description=$quoted");

Metadata

DBI 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.

create table tabulka (
    id serial primary key,
    sloupec1 varchar(255),
    sloupec2 varchar(255),
    sloupec3 varchar(255)
);

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.

my $commit = 1;
while(<DATA>){
    chomp;
    $commit &&= $sth->execute(split /:/);
}

if($commit){
    $dbh->commit;
}else{
    $dbh->rollback;
}

DBI shell

Jako 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.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

15.6.2017 9:34 / Ondřej Havlas
php,

10.6.2017 10:39 / Temple
sell home for cash

11.5.2017 23:32 / lelo
Re: Problém se správcem balíčků

11.5.2017 5:45 / davd mašek
Re: Problém se správcem balíčků

10.5.2017 22:54 / lelo
Re: Problém se správcem balíčků

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze