www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Kapitel 18: Persistenz und Datenbanken

Inhalt
Synopsis
# Persistenz von Hashes und Arrays in DB- und DBM-Dateien:
use DB_File;
tie %h, 'DB_File', $filename, O_CREAT | O_RDWR, 0666 or die "...";
tie @a, 'DB_File', $filename, O_CREAT | O_RDWR, 0666, $DB_RECNO
    or die "can't tie: $!\n";

# Stringifizierung komplexer Datenstrukturen:
use FreezeThaw;   $str = freeze($complex); $cmplx = thaw($str);
use Data::Dumper; $str = Data::Dumper->Dump($complex, [@varnames]);
                  eval $str;   # Zum Destringifizieren
use Storable;     $str      = freeze \%table;
                  %tblclone = thaw %{ $str };
                  nstore_fd( $cmplx, \*FH );
                  $newcmplx = retrieve_fd( \*FH );

# Persistente Speicherung mit Stringifizierung:
use MLDBM qw(DB_File Storable);
tie %h, 'MLDBM', $filename, O_CREAT | O_RDWR, 0666 or die "...";
$h{$key} = { I => 1, II => 2, [ 'one', 'more', 'test' ] };

# SQL-Crashkurs:
SELECT field1, field2 FROM table WHERE field3 = 'somevalue';
INSERT table ( field1, field2 ) VALUES ('val1', 'val2');
UPDATE table SET field1='newval1', field2='newval2' WHERE f3='xyz';
DELETE FROM table WHERE fieldX RLIKE '^test';
DROP TABLE tablename;
CREATE TABLE (
       field1 INTEGER AUTO_INCREMENT PRIMARY KEY,
       field2 CHAR(20) NOT NULL, field3 VARCHAR(127),
       UNIQUE (field2, field3) );

# MySQL-Download, Installation und Administration:
# URL von MySQL: http://www.tcx.se/
./configure --prefix=/usr/local/mysql \
            --sharedstatedir=/var/local/mysql/com \
            --localstatedir=/var/local/mysql/data \
            --info-dir=/usr/local/info \
            --with-unix-socket-path=/var/local/mysql/mysql.sock \
            --without-debug --with-charset=latin1
/etc/init.d/mysql.server [start | stop]
mysqladmin --user=root --password='somepass' processlist
mysqldump -u root -p --opt tobackupdb > backup-file.sql
mysqldump -u root -p --opt srcdb | mysql --host=remotehost -C destdb

# Zugangskontrolle fuer MySQL in der Systemdatenbank mysql
# user: user/pass, db: user/db, host: user+host/db
# tables_priv: user/tables, fields_priv: user/fields
# Siehe auch SQL-Befehle GRANT und REVOKE.

mysqlshow [datenbank [tabelle]]  # Anzeige von Strukturen
mysql --user=dbuser --password='apassword' dbname # SQL-Monitor

# Zugriff auf Datenbanken aus Perl heraus mit DBI:
# DBI + DBD::*, z.B. DBD::mysql, DBD::oracle, DBD::sybase, ...
use DBI;
$dsn = "dbi:mysql:database=$dbasename";
$dbh = DBI->connect($dsn, $user, $password);
die "Error: $DBI::errstr\n" if $DBI::err; # Fehlerbehandlung!

$rows_affected = $dbh->do($sql);  # Einfaches SQL ohne SELECT
$sth = $dbh->prepare($sql);  # Kompliziertes SQL, z.B. SELECT
                             # Placeholder: SELECT ? FROM $tbl
$sth->execute($opt_param_for_placeholders);
while ($rowptr = $sth->fetchrow_arrayref()) {
    @fields_of_a_row = @{ $rowptr };
}
$sth->finish();
$dbh->disconnect();

# Metainformationen anfordern:
@localdrivers = DBI->available_drivers();
@localdbases  = DBI->data_sources("mysql");
@remotedb = DBI->install_driver("mysql")->func($host, $port, "_ListDBs");
@tables = $dbh->func("_ListTables");

$sth = $dbh->prepare("LISTFIELDS $tbl"); $sth->execute();
@fieldnames = @{ $sth->{'NAME'} };  $sth->finish();

# Tabelle sperren und wieder freigeben
UPDATE table SET field = field + 1 WHERE condition;  # Atomar
LOCK   TABLES tbl1 READ, tbl2 READ, tbl3 WRITE;
# >>> Hier kritischer Bereich <<<
UNLOCK TABLES

# Die Module Tie::DBI und Tie::RDBM
use Tie::DBI;
tie %h, 'Tie::DBI', { db => $dsn,      user => $u,    password => $pw,
                      table => $tname, key => $fname, CLOBBER => 2  };
$h{$key}->{'fieldX'} = $newvalue;
$h{$key} = { field1 => $val1, field2 => $val2, $field3 => $val3 };
tield(%h)->commit();

use Tie::RDBM;
tie %h, 'Tie::RDBM', { db => $dsn, table => $tbl, create => 1, ... };
$h{$key} = { I => 1, II => 2, [ 'a', 'complex', 'struct' ] };
Beispielprogramme
stringify-destringify.pl Persistenz durch manuelle Stringifizierung
freeze-thaw-freeze.pl Stringifiziert mittels freeze()
freeze-thaw-thaw.pl Destringifiziert mittels thaw()
data-dumper-purity.pl Zirkuläre Referenzen mit Data::Dumper
storable-many.pl Mehrere Datenstrukturen mit Storable speichern
mysql-init.sql Backup der mysql-Systemdatenbank
db-listdb.pl Zeigt alle vorhandenen MySQL-Datenbanken an
db-listtbl.pl Zeigt eine Liste von Tabellen einer MySQL-Datenbank an
db-listfld.pl Liste von Feldnamen einer bestimmten Tabelle
db-dodemo.pl Zeigt einige do()-SQL-Befehle an eine Datenbank
db-prepare.pl Zeigt die Verwendung von SELECT in Perl
db-placeholder.pl SQL-Befehle mit Platzhaltern in Perl
db-isql.pl Ein interaktiver SQL-Monitor mit DBI-Unterstützung
db-tiedbi.pl Persistente Hashes mit Datenbank-Backend: Tie::DBI
tie-dbi.synopsis Synopsis von Tie::DBI (Version 0.85)
db-tierdbm.pl Persistente Hashes auf Datenbanktabellen: Tie::RDBM
Ergänzungen
Lösungen zu ausgewählten Übungsaufgaben

In Vorbereitung

FAQ

In Vorbereitung

Errata

[Prev] [Up] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:45 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo