Perl DBI ¤Jªù
¥Ø¿ý
¥»¤å¬O¥H Perl
DBI Examples ¬°ÂÅ¥»¡A°t¦X DBMaker ¦n¾Ç©ö¥Îªº¯S©Ê¡A¥H¤Î´XÓ²LÅã©öÀ´ªº¨Ò¤l¡A§Æ±æ¯à°÷¤@¨B¨B¦a±a»â¨Ï¥ÎªÌ¾Ç²ß
Perl DBI modules ¦s¨ú DBMaker ¸ê®Æ®wªº¤èªk¡C¦Óì§@ªÌ¼¶¼g¥Dnì°Ê¤O¬O§Æ±æÂǥѳo½g¤å³¹ªº°Ý¥@¡A¥H°§C DBI
mailing list ¤¤¤@¦A«½Æ¥X²{ªº FAQ¡C
Ū§¹¥»¤å¤§«á¡A§ÚÌ´N¯à¾Ç¨ì§Q¥Î DBI «Ø¥ß¤@Ó§¹³Æªº¸ê®Æ®wµ{¦¡¡C ¥H¤U´N¥ý¥Ñ DBI ªº°ò¥»¥\¯à¶}©l¡AµM«á¦A³v¨B¬ã¨s§ïµ½®Ä¯à»P¥i¾a«×§Þ¥©¡C
DBI - Database independent interface for Perl. Perl DBI ¬O Perl µ{¦¡»y¨¥¦s¨ú¸ê®Æ®w®Éªº¼Ð·ÇÀ³¥Îµ{¦¡¤¶±
(API)¡C DBI ¤¤©w¸q¤F¤@²Õ¨ç¼Æ¡BÅܼƩM¤@P©Êªº¸ê®Æ®w¤¶±¡A ¥iº¡¨¬»P¯S©w¸ê®Æ®wµLÃöªº¯S©Ê¡C
ȱo¤@´£ªº¡ADBI ¥u¬O¤@Óµ{¦¡¤¶±¡A§Q¥Î¤@²Õ¤Q¤À»´¥©ªº¼h±¡A ±N§AªºÀ³¥Îµ{¦¡»P¤@Ó¥H¤Wªº¸ê®Æ®wÅX°Êµ{¦¡ºò±K¦aµ²¦X¦b¤@°_¡A DBI ªº¬[ºc¥Dn¥u¬O´£¨Ñ¼Ð·Çªº¤¶±¡A¥Øªº¬O¬°¤F¤è«K¨Ï¥ÎªÌ¤U¹F¤@¨Ç²³æªº«ü¥O¡A
´N¥i¥H»´©ö¦aÅý¨º¨ÇÅX°Êµ{¦¡µo´§§@¥Î
º¥ý¸Ó°µªº¨Æ´N¬O«Øºc¥H¤Î¦w¸Ë DBI¡A ¸Ô²Óªº¨BÆJ¥i°Ñ¦Ò DBI INSTALL ¤å¥ó¤¤¦³»¡©ú. µM«á¦A¨Ó´N¬O«Øºc¥X©Ò»Ýªº¸ê®Æ®wÅX°Êµ{¦¡¡A©Î¬O°Ñ¦Ò
DBD. ¦b¨CÓ DBD ®M¥ó¤¤³£À³¸Ó·|¦³«Øºcµ{§Ç¡C »P¨ä¥L
Perl ¼Ò²Õ¬Û¸û¤§¤U¡A ¦w¸Ë DBI/DBD ¨BÆJºâ¬O¬Û·í®e©ö
localhost:~/DBI-1.08$ perl Makefile.PL && make
&& make test && make install
¦b DBI »P DBD ¦w¸Ë§¹¦¨¤§«á¡A ±z¥i¥H°õ¦æ¤U¦C«ü¥O¾\Ū§ó¦hªº¸ê°T:
localhost:~$ perldoc DBI
¨C¤@ºØ¸ê®Æ®w³£¦³¤£¦Pªº³s½u¤è¦¡¡A Y¬O·Qª¾¹D¯S®í¥Îªk¡A ½Ð°È¥²¾\Ū DBD ©Ò´£¨Ñªº»¡©ú¤å¥ó¡C ¤U±ªº¨Ò¤l¬O³s½u¨ì DBMaker ªº°ò¥»¤èªk.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
);
¤Wzªº connect ¨ç¼Æ¥Î¨ì¤F¤TӰѼÆ: ¸ê®Æ¨Ó·½¦WºÙ (data source name, DSN), ¨Ï¥ÎªÌ¦WºÙ©M±K½X¡C ¨ä¤¤
DSN ªº®æ¦¡¬° dbi:DriverName:instance. ¤£¹L§ÚÌn¦p¦óª¾¹D³s½u¦¨¤£¦¨¥\©O? º¥ý¥i¥H¬d¬Ý connect
ªº¶Ç¦^È¡Atrue ¥Nªí¦¨¥\¡Afalse ´N¬O¥Nªí¥¢±Ñ¡C ¨ä¦¸¡A·í¦³¿ù»~µo¥Í®É¡A DBI ·|§â¿ù»~°T®§¦s©ñ¦b package variable
$DBI::errstr ¤§¤¤¡C
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
)
|| die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
µ²§ô¸ê®Æ®w³s½u½Ð¨Ï¥Î disconnect() ¨ç¼Æ¡A ¥¿½T¦a¨Ï¥Î¥iÁ×§K¿ù»~°T®§ "Database handle
destroyed without explicit disconnect" ªºµo¥Í.
¦b³s½u¸ê®Æ®w®É connect() ³oÓ¤èªk¥i¥H±µ¨ü hash «¬ºAªº¿ï¶µ¡A±`¥Îªº¿ï¶µ¥]¬A¤F: AutoCommit¡A³]¬°
true ªí¥Ü¸ê®Æ®w¥æ©ö¦Û°Ê½T»{¡F RaiseError¡A§i¶D DBI ¦b¿ù»~µo¥Í®ÉIJµo¨Ò¥~ croak
$DBI::errstr ¦Ó¤£¥u¬O¶È¶Ç¦^¿ù»~¥N½X¡FPrintError¡AÅý DBI ¥Hĵ§i¤è¦¡
warn $DBI::errstr ¶Ç¦^¿ù»~°T®§.
¦b¤U¤@¬qµ{¦¡¤¤¡A¬O§Æ±æ¶i¦æ±Ä¥æ©ö³B²zªº¥Îªk¡A³]©w¦¨ AutoCommit off¡ARaiseError
on¡A¦ÓÅý PrintError ¨Ï¥Î¤º©wÈ on.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
¦³¤@ÂIn¯S§Oª`·N¡A¦pªG¸ê®Æ®w¥»¨¤£¤ä´©¥æ©ö³B²zªº¥\¯à®É¡A³]©w AutoCommit off ·|±µ¦¬¨ì¿ù»~µo¥Íªº¶Ç¦^È.
²{¦b¶}©l¥i¥H¹ï§Ú̪º¸ê®Æ®w°µ¤@¨Ç¦³·N¸qªº¨Æ¤F. ¤U¹F¦Ü¸ê®Æ®wªº SQL Ütz¤À¦¨¨âÃþ. ¤@¬O¬d¸ß«ü¥O¡A¹w´Á·|¦³¼Æµ§¸ê®Æ¶Ç¦^¡A¨Ò¦p SELECT¡A³o¤@Ãþªº«ü¥O§ÚÌ·|¨Ï¥Î
prepare ¤èªk. ¥t¤@Ãþªº«ü¥O¡A¦p CREATE ©M DELETE¡A§ÚÌ·|¨Ï¥Î
do ¤èªk. §ÚÌ¥ý¬Ý¬Ý«áªÌ¦p¦ó¨Ï¥Î.
³o¤@¬qµ{¦¡¥Ü½d¦b¸ê®Æ®w¤¤«Ø¥ß¤@Óû¤u¸ê®Æªí®æªº¤èªk.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my $sql = qq{ CREATE TABLE employees ( id INTEGER NOT NULL,
name VARCHAR(128),
title VARCHAR(128),
phone CHAR(10)
) };
$dbh->do( $sql );
$dbh->commit();
$dbh->disconnect();
§Ṳ́w¸g¾Ç·|¤F³s½u¸ê®Æ®w¡A¿ù»~°»´ú¡A¥H¤Î¤U¹F²³æªº SQL Ützªº¤èªk. ¬O¸Ó¾Ç¤@¨Ç§ó¦³¥Îªºµ{¦¡»yªkªº®ÉÔ¤F.
¦b SQL ªºÜtz¤¤¡A³Ì±`¨Ï¥Îªº«ü¥O²ö¹L©ó SELECT Ütz. ¬°¤F¨Ï¥Î SELECT¡A§ÚÌÀ³¸Ó¥ý
prepare ³o¤@¬qÜtz¡AµM«á¶i¦æ execute °Ê§@. ¦b¤U±ªºµ{¦¡¤ù¬q¤¤¡A§Ú̳£·|¨Ï¥Î
statement handle $sth ¦³¦s¨ú SELECT ªºµ²ªG.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jeerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my $sql = qq{ SELECT * FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
$dbh->disconnect();
¤Wzµ{¦¡n¨D DBMaker ¸ê®Æ®w¬°¬d¸ß«ü¥O¥ý·Ç³Æ¦n°õ¦æpµe¡A¤§«á¦A°õ¦æ¸Ó¬d¸ß«ü¥O. ¨ì¥Ø«e¬°¤îÁÙ¨S¦³¥ô¦ó¤@µ§°O¿ý¶Ç¦^. µy«á§ÚÌ·|¨Ï¥Î
bind_columns ªº§Þ³N¥H¨ú±o¸ê®Æ®w¿é¥Xªº°O¿ý. bind_columns
¤À§O±N¨CÓ¿é¥XÄæ¦ìôµ²¨ì¤@Ó scalar reference. ¤@¥¹©I¥s¨ì fetch ®É¡A³o¨Ç scalars
´N·|¶ñ¤J³o¸ê®Æ®w¶Ç¦^ªºÈ.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my $sql = qq{ SELECT id, name, title, phone FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
$sth->finish();
$dbh->disconnect();
³oˬO¤@Ó¦C¦L¥X¥þ¤½¥q¹q¸Ü³sµ¸Ã¯ªº¦n¤èªk¡A¤×¨ä¬O WHERE °Ï¶ôªº¨Ï¥ÎÅý§ÚÌ»´©ö¦a¨ú¥X©Ò¦³ªº¸ê®Æ¿é¥X! ¤U±·|§Q¥Î¨ì
bind_param ¥ý±N SQL Ütz°µ¤@¦¸ prepare¡A´N¯à°÷°ª³t¦a°õ¦æ³\¦h¦¸.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );
my $sql = qq{ SELECT id, name, title, phone FROM employees WHERE name LIKE ? };
my $sth = $dbh->prepare( $sql );
for( @names ) {
$sth->bind_param( 1, $_);
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
}
$sth->finish();
$dbh->disconnect();
¨ì¥Ø«e¬°¤î¡A§Ú̪º°Ê§@³£ÁÙ¤£»Ýn¨Ï¥Î¨ì¥æ©ö¾÷¨îªº¥\¯à¡A¤£¹L·í¤U¹F UPDATE ©Î¬O DELETE
Ütz®É¡A§ÚÌ´N·|§Æ±æ¨Ï¥Î¨ì¥¦¤F. ®Ú¾Ú DBI ¤å¥ó«ü¥X¡A¦pªG·Q»s§@¤@®MéTªº¥æ©ö¾÷¨î¡A´NÀ³¸Ó°t¦X eval{...}
°Ï¶ô¨ÓÄdºI¿ù»~ªºµo¥Í¡A³Ì«á¦A¨Ï¥Î commit ©Î rollback ¨Ó§¹¦¨¾ãÓ¥æ©öµ{§Ç.
³o´N¬O§ÚÌ¥H¤U©Òn½Íªº¤º®e.
¥»µ{¦¡¥Ü½d«OÃÒ¥|µ§°O¿ý¼g¤J¸ê®Æ®wªº¤èªk.
use strict;
use DBI qw(:sql_types);
my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
'jerry',
'jerrypassword',
{
RaiseError => 1,
AutoCommit => 0
}
)
|| die "Database connection not made: $DBI::errstr";
my @records = (
[ 0, "Larry Wall", "Perl Author", "555-0101" ],
[ 1, "Tim Bunce", "DBI Author", "555-0202" ],
[ 2, "Randal Schwartz", "Guy at Large", "555-0303" ],
[ 3, "Doug MacEachern", "Apache Man", "555-0404" ]
);
my $sql = qq{ INSERT INTO employees VALUES ( ?, ?, ?, ? ) };
my $sth = $dbh->prepare( $sql );
for( @records ) {
eval {
$sth->bind_param( 1, @$_->[0]);
$sth->bind_param( 2, @$_->[1]);
$sth->bind_param( 3, @$_->[2]);
$sth->bind_param( 4, @$_->[3]);
$sth->execute();
$dbh->commit();
};
if( $@ ) {
warn "Database error: $DBI::errstr\n";
$dbh->rollback(); #just die if rollback is failing
}
}
$sth->finish();
$dbh->disconnect();
- Ãö©ó
finish ªº©I¥s¦b§Ú̪º¨Ò¤lùب䣬O¥²nªº. ³oÓ¨ç¼Æ¾A¥Î©ó statement handle
§¹¦¨®É©Ò¨Ï¥Î¡C
- ¥Ã»·n¥[¤W
use strict¡C
- ¥J²Ó¾\Ū Perl DBI manual ¥H²`¤JÁA¸Ñ DBI ¬[ºc
This document rewrite to Chinese by
Jackie Yu. Last modified 20 May 1999
This document Copyright Jeffrey
William Baker. Last modified 10 October 1998
¶W®wºô¯¸ / §Þ³N±M°Ï / ¶}µo¤u¨ã°Ï - Perl DBI ¤Jªù
|