Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
SDBM_File-ModulDB_File-ModulBerkeleyDB-ModulFreezeThaw-ModulData::Dumper-ModulStorable-ModulMLDBM/etc/my.confDBI und DBD::mysql
do()prepare()LOCK TABLES sperrenTie::DBI-ModulTie::RDBM
# 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' ] };
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 |
connect() aufgerufen, wenn der Datenbankserver auf einem anderen Rechner liegt?db-listtbl.pl wurden in der Funktion open_dbase() nicht alle Parameter berücksichtigt. Insbesondere kamen die Parameter host, aber auch eventuell port nicht zum Einsatz. Daher konnte diese Funktion nur eine Verbindung zu einem Datenbankserver aufnehmen, der auf demselben Host lief.connect() in man DBI und in man DBD::mysql zeigt jedoch auch, daß es möglich ist, eine Verbindung zu einem entfernten Datenbankserver aufzunehmen. Dazu muß die DSN um diese beiden Parametern erweitert werden.$host läuft, wobei dieser Server auf den Port $port auf Anforderungen wartet. Fehlt die $port-Angabe, wird der Defaultport von mysqld (3306/tcp) angenommen:
$dsn = "DBI:mysql:database=mydbase;host=$host"; $dsn = "DBI:mysql:database=mydbase;host=$host;port=$port"; $dbh = DBI->connect($dsn, $user, $password);
open_dbase() in db-listtbl.pl wie folgt erweitern (Erweiterungen in Fettschrift):
sub open_dbase {
# Oeffnet eine Datenbank auf einem angegebenen Host.
# Liefert ein Datenbankhandle $dbh zurueck.
# Beispiel: $dbh = open_dbase( dbname => $dbname );
# $dbh = open_dbase( dbname => $dbname, pw => $passwd );
# ACHTUNG: Vergessen Sie nicht, $dbh nach Gebrauch auch explizit
# mit $dbh->disconnect() freizugeben!
my %p = (
dbname => 'test',
user => $ENV{'LOGNAME'},
pw => '',
host => DBHOST,
port => DBPORT,
driver => 'mysql',
@_ );
my $dsn = "DBI:$p{'driver'}:database=$p{'dbname'}" .
";host=$p{'host'};port=$p{'port'}";
my $dbh = DBI->connect($dsn, $p{'user'}, $p{'pw'});
print STDERR "Error connecting to $p{'dbname'}: $DBI::errstr\n"
unless $dbh;
return $dbh;
}
quote() entwerten:db-dodemo.pl wurden mit Hilfe von map um jeden einzufügenden Wert einfache Hochkommata gesetzt:
$sql = "INSERT INTO kunden VALUES (" .
join(',', map { "'$_'" } @custs) .
")\n";
INSERT INTO kunden VALUES (
'Wert 1', 'Wert 2', 'Wert 3'
)
Wert 1", "Wert 2" und "Wert 3" erzeugt werden. Das funktioniert aber nur in den Fällen, wo keine Hochkommata oder sonstigen SQL-Sonderzeichen in den einzufügenden Werten vorhanden sind. Im allgemeinen Fall müssen all diese Sonderzeichen erst entwertet werden. Glücklicherweise müssen wir dies nicht selbst tun, sondern können die Funktion quote() des DBI-Moduls verwenden. Diese Funktion entwertet alle SQL-Sonderzeichen, und setzt darüberhinaus ein externes Paar von Quotes um das so verarbeitete Argument.quote() in unserem Beispiel verwendet? Wir können nach wie vor map verwenden, müssen aber nur den map-Ausdruck verändern:
$sql = "INSERT INTO kunden VALUES (" .
join(',', map { $dbh->quote($_) } @custs)) .
")\n";
0;o'toole;peter;442.111.234.121;somewhere 11;44343;
INSERT INTO kunden VALUES ('0','o\'toole','peter','442.111.234.121',
'somewhere 11','44343')
counter3.pl, ein flexibler Zähler mit DBI-Backend. (1999/12/10)In Vorbereitung
In Vorbereitung
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:55:45 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|