Perl/Databáze/DBI
DBI = DataBaseInterface je perlovské rozhraní pro práci s databázemi (Database independent interface for Perl)
Viz: Perl/Databáze
Dokumentace
[editovat]perldoc DBI
Příklad
[editovat]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émy
[editovat]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í!
- RE: Retrieving warnings after executing a MySQL INSERT statement
- Peter J. HolzerRe: Retrieving warnings after executing a MySQL INSERT statement