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¥D­n­ì°Ê¤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¥D­n¥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 

«Ø¥ß³s½u

¨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',
                      );
    

¤W­zªº 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();
    

¦³¤@ÂI­n¯S§Oª`·N¡A¦pªG¸ê®Æ®w¥»¨­¤£¤ä´©¥æ©ö³B²zªº¥\¯à®É¡A³]©w AutoCommit off ·|±µ¦¬¨ì¿ù»~µo¥Íªº¶Ç¦^­È.

¤U¹F SQL

²{¦b¶}©l¥i¥H¹ï§Ú­Ìªº¸ê®Æ®w°µ¤@¨Ç¦³·N¸qªº¨Æ¤F. ¤U¹F¦Ü¸ê®Æ®wªº SQL Üt­z¤À¦¨¨âÃþ. ¤@¬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();
    

¶i¶¥¥\¯à

§Ú­Ì¤w¸g¾Ç·|¤F³s½u¸ê®Æ®w¡A¿ù»~°»´ú¡A¥H¤Î¤U¹F²³æªº SQL Üt­zªº¤èªk. ¬O¸Ó¾Ç¤@¨Ç§ó¦³¥Îªºµ{¦¡»yªkªº®É­Ô¤F.

SELECT Üt­z

¦b SQL ªºÜt­z¤¤¡A³Ì±`¨Ï¥Îªº«ü¥O²ö¹L©ó SELECT Üt­z. ¬°¤F¨Ï¥Î SELECT¡A§Ú­ÌÀ³¸Ó¥ý prepare ³o¤@¬qÜt­z¡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();
    

¤W­zµ{¦¡­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 Üt­z°µ¤@¦¸ 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 Üt­z®É¡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();
    

ª`·N¨Æ¶µ

  1. Ãö©ó finish ªº©I¥s¦b§Ú­Ìªº¨Ò¤lùب䣬O¥²­nªº. ³o­Ó¨ç¼Æ¾A¥Î©ó statement handle §¹¦¨®É©Ò¨Ï¥Î¡C
  2. ¥Ã»·­n¥[¤W use strict¡C
  3. ¥J²Ó¾\Ū Perl DBI manual ¥H²`¤JÁA¸Ñ DBI ¬[ºc

¨ä¥L¸ê°T


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ªù
Copyright 2002 SYSCOM Computer Engineering Co. All rights reserved.