美文网首页MySQL
Perl 数据库模块的封装和调用

Perl 数据库模块的封装和调用

作者: 木白0101 | 来源:发表于2020-08-24 17:03 被阅读0次

在项目开发的过程中,也经常遇到perl程序操作数据库的需求。
Perl 5 提供了 DBI 模块来连接和操作数据库。
但是需要怎样编写和封装才能写出简洁高效的数据模块,是需要思考的一个问题。
下面提供一个数据库模块封装的实例,以供参考。
1.编译安装DBI模块。(在这里省略)
2.封装数据库模块,以MYSQL为例。

##############################################################
#PerlDBI.pm
#mysql数据库连接和操作模块
#日期:2020/08/24
#author:木白0101
#############################################################
package PerlDBI;
use strict;
use Encode;
use DBI;
use Constants;
######time###############
our($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
$year=1900+$year;
$mon=$mon+1;
our $logtime="$year-$mon-$mday $hour:$min:$sec\t";
our $audit=0;
##########构造函数###########
sub new {
    my $class = shift;       # 存储包的名字
    my $self = {};           # 指向一个空的匿名散列
    bless $self, ref($class) || $class;  #bless散列到当前包
    my $username=Constants::MYSQL_USERNAME; #db_username
    my $password=Constants::MYSQL_PASSWORD; #db_password
    my $host=Constants::MYSQL_HOST;                            #db_host
    my $dbname=Constants::MYSQL_DATABASE;
    my $dbh = DBI->connect("DBI:mysql:$dbname;$host", $username, $password,{mysql_auto_reconnect => 1}) or logger($self->{_dbh}->errstr," ");
    $dbh->do("SET character_set_client = 'utf8'");
    $dbh->do("SET character_set_connection = 'utf8'");
    $dbh->do("SET character_set_results= 'utf8'");
    $dbh->do("SET NAMES 'utf8'");
    $dbh->{AutoCommit} = 0;
    $self->{_dbh}=$dbh;
    return $self;
  }

############查询函数返回多行记录###########
#参数:sql
#返回:hash数组
############查询函数返回多行记录###########
sub func_select_rows
{
    my $self = shift;
    my $sql = shift;    #参数sql
    my @result;
    my $sth = $self->{_dbh}->prepare($sql) or logger($self->{_dbh}->errstr,$sql);
    $sth->execute() or logger($self->{_dbh}->errstr,$sql);
    while (my $rowref = $sth->fetchrow_hashref()) {
        push(@result,$rowref);
    }
    $sth->finish();
    
    return @result;
}

############查询函数返回一行记录###########
#参数:sql
#返回:hash
############查询函数返回一行记录###########
sub func_select_one
{
    my $self = shift;
    my $sql = shift;    #参数sql
    my $sth = $self->{_dbh}->prepare($sql) or logger($self->{_dbh}->errstr,$sql);
    $sth->execute()  or logger($self->{_dbh}->errstr,$sql);
    my $rowref = $sth->fetchrow_hashref();
    $sth->finish();
    return $rowref;
}

############插入、更新、删除函数###########
#参数:sql
#返回:rows 影响条数
############插入、更新、删除函数###########
sub func_do
{
    my $self = shift;
    my $sql = shift;        #sql参数
    my $rows = $self->{_dbh}->do($sql)  or logger($self->{_dbh}->errstr,$sql);
        
    return $rows;
}

sub quote
{
    my $self = shift;
    my $param = shift;
    return $self->{_dbh}->quote($param);
}


###########COMMIT###########
sub commit
{
    my($self) = @_;
    $self->{_dbh}->commit() or die $self->{_dbh}->errstr;
}

###########ROLLBACK#########
sub rollback
{
    my($self) = @_;
    $self->{_dbh}->rollback() or die $self->{_dbh}->errstr;
}

###########析构函数,断开DB连接###########
sub disconnect
{
    my($self) = @_;
    $self->{_dbh}->disconnect() or die $self->{_dbh}->errstr;
}

sub logger
{
    my($msg,$sql) = @_;
    my $errpath=Constants::LIB_DIR."/errsql.log";
    open OUT,">>$errpath" or die $!;
    print OUT $logtime."\t".$msg."\t".$sql."\n";
    close OUT;
}

1;

3.程序调用数据库模块

##############################################################
#
#auto_db_access.pl
#
#数据库操作示例
#日期:2020/08/24
#author:木白0101
#############################################################
use warnings;
use strict;
use Data::Dumper;
use PerlDBI;    #引用数据库模块


my $dbi = new PerlDBI;

#查询多行
my $site_sql = "select chr,sta_pos,end_pos from read_range";
my @hash_site_result = $dbi->func_select_rows($site_sql);
my $regions = "";
foreach my $read_range(@hash_site_result){
    my $chr_read = $read_range->{"chr"};
    my $sta_pos = $read_range->{"sta_pos"};
    my $end_pos = $read_range->{"end_pos"};
}

#查询单行
my $user_info = $dbi->func_select_one("select sample_no,sex,birth_date from user_info where sample_no like '%".$sample_no."%'");
my $gender = $user_info->{"sex"};

#数据库操作
my $insert_sql = "insert into user_info(sample_no,sex,birth_date)values('test','male','2020-08-24')";
my $rows = $dbi->func_do($insert_sql);
$dbi->commit();

#关闭连接
$dbi->disconnect();

相关文章

  • Perl 数据库模块的封装和调用

    在项目开发的过程中,也经常遇到perl程序操作数据库的需求。Perl 5 提供了 DBI 模块来连接和操作数据库。...

  • Perl 数据库连接

    Perl 数据库连接 本章节我们将为大家介绍 Perl 数据库的连接。 Perl 5 中我们可以使用 DBI 模块...

  • 小程序封装网络请求

    对小程序原生的请求代码进行封装 Promise封装fetch模块 utils/fetch.js 调用fetch模块

  • DAY9-作业

    封装一个模块,可以在调用这个模块时能够读写指定的文件。

  • 解决一个问题----cpan配置(proxy,mirror)

    在安装perl模块时候,你可能会用到miniconda中的cpan来快速安装perl模块(手工装perl模块太痛苦...

  • perl 模块安装与使用

    查看perl 版本 查看perl模块搜索路径 查看某个perl模块是否存在 模块安装方法1 —— 命令行形式安装S...

  • python之datetime模块

    datetime 模块 datatime 模块重新封装了 time 模块,提供了更多接口,变得更加直观和易于调用。...

  • SQLite - Perl

    SQLite - Perl 安装 SQLite3 可使用 Perl DBI 模块与 Perl 进行集成。Perl ...

  • python 模块

    容器 --- 数据的封装函数 ---语句的封装类 --- 方法和属性的封装模块 --- 模块就是程序 导入模块 ...

  • perl更新后perl模块调用不了问题 2020-06-02

    如图出现类似报错均是Perl模块和更新的Perl版本冲突问题,需要添加Perl5对应的SVGlib路径解决如下: ...

网友评论

    本文标题:Perl 数据库模块的封装和调用

    本文链接:https://www.haomeiwen.com/subject/jlvnjktx.html