Perl/Databáze/DBI

DBI = DataBaseInterface je perlovské rozhraní pro práci s databázemi (Database independent interface for Perl)

Viz: Perl/Databáze

DokumentaceEditovat

perldoc DBI

PříkladEditovat

Typický začátek skriptu: Navážeme spojení s databází a vytvoříme handle $dbh, pomocí něhož se budeme na naši databázi dále odkazovat:

#! /usr/bin/perl -w
# Demonstrace použití DBI

use DBI;
use strict;

my $dbname      = 'jmenodatabaze';
my $hostname    = 'localhost';
my $dsn       = "DBI:mysql:database=$dbname;host=$hostname;port=$port"; # port se může vynechat
my $user        = 'jmenouzivatele';
my $password    = 'heslo:BreKeKeKe/123456%zblunk';

my $dbh = DBI->connect($dsn, $user, $password, { RaiseError=>1,AutoCommit=>0 })
  || die "Chyba připojení k databázi č. $DBI::err: $DBI::errstr\n"; # uplatní se jen při RaiseError=>0

Jednoduchý příkaz databázi pošleme metodou do. Například databázi MySQL řekneme, že s námi má komunikovat v UTF-8 (namísto v defaultním latin1):

$dbh->do("set names 'utf8'");

Typické operace s databází se ale vykonávají kvůli urychlení pomocí metody prepare(), která připraví provedení příkazu, a metody a execute(), která jej vykoná. Např. vyčtení všech řádků tabulky:

my $sth = $dbh->prepare("SELECT * FROM nejakatabulka");
$sth->execute();

Všechny řádky pak můžeme přečíst metodou fetchrow_array, např:

while (my ($jmeno, $prijmeni, $telefon) = $sth->fetchrow_array)  {
 print "$jmeno $prijmeni: $telefon\n";
}

Ukončení skriptu, odpojení od databáze:

$dbh->disconnect;

ProblémyEditovat

Pokud vložíme hodnotu se špatným typem (např. text do číselného sloupce, hodnotu nedefinovanou v ENUM nebo SET apod.), MySQL hlásí warning, např:

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'n' at row 1 |
| Warning | 1265 | Data truncated for column 'event' at row 1          |
+---------+------+-----------------------------------------------------+

Ale DBI driver žádné takové varování neohlásí!

TutoriályEditovat

SkriptyEditovat