设为首页 收藏本站
查看: 972|回复: 0

[经验分享] Perl DBI 入门

[复制链接]

尚未签到

发表于 2018-8-31 08:05:20 | 显示全部楼层 |阅读模式
  目录
  基本功能
  建立连线
  选项
  下达 SQL
  进阶功能
  SELECT 述
  高等技巧
  交易机制
  注意事项
  其他资讯
  本文是以 Perl DBI Examples 为蓝本,配合 DBMaker 好学易用的特性,以及几个浅显易懂的例子,希望能够一步步地带领使用者学习 Perl DBI modules 存取 DBMaker 资料库的方法。而原作者撰写主要原动力是希望藉由这篇文章的问世,以降低 DBI mailing list 中一再重出现的 FAQ。
  读完本文之後,我们就能学到利用 DBI 建立一个完备的资料库程式。 以下就先由 DBI 的基本功能开始,然後再逐步研究改善效能与可靠度技巧。
  基本功能
  DBI - Database independent interface for Perl. Perl DBI 是 Perl 程式语言存取资料库时的标准应用程式介面 (API)。 DBI 中定义了一组函数、变数和一致性的资料库介面, 可满足与特定资料库无关的特性。
  值得一提的,DBI 只是一个程式介面,利用一组十分轻巧的层面, 将你的应用程式与一个以上的资料库驱动程式紧密地结合在一起, DBI 的架构主要只是提供标准的介面,目的是为了方便使用者下达一些简单的指令, 就可以轻易地让那些驱动程式发挥作用
  首先该做的事就是建构以及安装 DBI, 详细的步骤可参考 DBI INSTALL 文件中有说明. 然後再来就是建构出所需的资料库驱动程式,或是参考 DBD. 在每个 DBD 套件中都应该会有建构程序。 与其他 Perl 模组相较之下, 安装 DBI/DBD 步骤算是相当容易
  localhost:~/DBI-1.08$ perl Makefile.PL && make
  && make test && make install
  在 DBI 与 DBD 安装完成之後, 您可以执行下列指令阅读更多的资讯:
  localhost:~$ perldoc DBI
  建立连线
  每一种资料库都有不同的连线方式, 若是想知道特殊用法, 请务必阅读 DBD 所提供的说明文件。 下面的例子是连线到 DBMaker 的基本方法.
  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
  'jerry',
  'jerrypassword',
  );
  上述的 connect 函数用到了三个参数: 资料来源名称 (data source name, DSN), 使用者名称和密码。 其中 DSN 的格式为 dbi:DriverName:instance. 不过我们要如何知道连线成不成功呢? 首先可以查看 connect 的传回值,true 代表成功,false 就是代表失败。 其次,当有错误发生时, DBI 会把错误讯息存放在 package variable $DBI::errstr 之中。
  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
  'jerry',
  'jerrypassword',
  )
  || die "Database connection not made: $DBI::errstr";
  $dbh->disconnect();
  结束资料库连线请使用 disconnect() 函数, 正确地使用可避免错误讯息 "Database handle destroyed without explicit disconnect" 的发生.
  选项
  在连线资料库时 connect() 这个方法可以接受 hash 型态的选项,常用的选项包括了: AutoCommit,设为 true 表示资料库交易自动确认; RaiseError,告诉 DBI 在错误发生时触发例外 croak $DBI::errstr 而不只是仅传回错误代码;PrintError,让 DBI 以警告方式 warn $DBI::errstr 传回错误讯息.
  在下一段程式中,是希望进行采交易处理的用法,设定成 AutoCommit off,RaiseError on,而让 PrintError 使用内定值 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();
  有一点要特别注意,如果资料库本身不支援交易处理的功能时,设定 AutoCommit off 会接收到错误发生的传回值.
  下达 SQL
  现在开始可以对我们的资料库做一些有意义的事了. 下达至资料库的 SQL 述分成两类. 一是查询指令,预期会有数笔资料传回,例如 SELECT,这一类的指令我们会使用 prepare 方法. 另一类的指令,如 CREATE 和 DELETE,我们会使用 do 方法. 我们先看看後者如何使用.
  这一段程式示在资料库中建立一个员工资料表格的方法.
  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 (>  name VARCHAR(128),
  title VARCHAR(128),
  phone CHAR(10)
  ) };
  $dbh->do( $sql );
  $dbh->commit();
  $dbh->disconnect();
  进阶功能
  我们已经学会了连线资料库,错误侦测,以及下达简单的 SQL 述的方法. 是该学一些更有用的程式语法的时候了.
  SELECT 述
  在 SQL 的述中,最常使用的指令莫过於 SELECT 述. 为了使用 SELECT,我们应该先 prepare 这一段述,然後进行 execute 动作. 在下面的程式片段中,我们都会使用 statement handle $sth 有存取 SELECT 的结果.
  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();
  上述程式要求 DBMaker 资料库为查询指令先准备好执行计画,之後再执行该查询指令. 到目前为止还没有任何一笔记录传回. 稍後我们会使用 bind_columns 的技术以取得资料库输出的记录. bind_columns 分别将每个输出栏位结到一个 scalar reference. 一旦呼叫到 fetch 时,这些 scalars 就会填入这资料库传回的值.
  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>  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, $phonen";
  }
  $sth->finish();
  $dbh->disconnect();
  这倒是一个列印出全公司电话连络簿的好方法,尤其是 WHERE 区块的使用让我们轻易地取出所有的资料输出! 下面会利用到 bind_param 先将 SQL 述做一次 prepare,就能够高速地执行许多次.
  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>  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, $phonen";
  }
  }
  $sth->finish();
  $dbh->disconnect();
  高等技巧
  交易机制
  到目前为止,我们的动作都还不需要使用到交易机制的功能,不过当下达 UPDATE 或是 DELETE 述时,我们就会希望使用到它了. 根据 DBI 文件指出,如果想作一套稳固的交易机制,就应该配合 eval{...} 区块来拦截错误的发生,最後再使用 commit 或 rollback 来完成整个交易程序. 这就是我们以下所要谈的内容.
  本程式示保四笔记录写入资料库的方法.
  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::errstrn";
  $dbh->rollback(); #just die if rollback is failing
  }
  }
  $sth->finish();
  $dbh->disconnect();
  注意事项
  关於 finish 的呼叫在我们的例子并不是必要的. 这个函数适用於 statement handle 完成时所使用。
  永远要加上 use strict。
  仔细阅读 Perl DBI manual 以深入解 DBI 架构
  其他资讯
  DBI - A Database Interface Module for Perl 5
  DBI at Hermetica
  DBI mailing list information
  DBI mailing list archives
  Persistent connections with mod_perl
  --------------------------------------------------------------------------------
  This document rewrite to Chinese by Jackie Yu. Last modified 20 May 1999
  This document Copyright Jeffrey William Baker. Last modified 10 October 1998


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559091-1-1.html 上篇帖子: 最常用的PERL正则表达式 下篇帖子: Perl DBI 数据库通讯模块规范,工作原理和实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表