最近为了简化工作流程,提高工作效率,一直在学习关于如何用perl直接操作数据库。查了很多资料,最后终于尝试成功。虽然学perl已经有一年多了,但最近随着对perl更加深入的了解,才发现perl比我以为的要强大的多。可以说,使用CPAN中的各种perl模块,几乎可以用perl完成任何工作。其实在perl中也有“面向对象”的概念。比如模块中的方法等,这些概念与面向对象的编程语言(如Java)中的概念一样。
以下是整个过程(因为我是在windows下安装的,所以只以windows为例)。
1.安装模块BDI以及DBD::mysql(在ppm中为DBD-mysql)
DBI是对于很多数据库的一个通用接口。这意味着你能编写一个脚本,不用改变就能工作于很多数据库引擎。你需要为每种数据库类型定义了的一个数据库驱动程序(DBD)。对于MySQL,该驱动程序称为DBD::mysql。这两个模块在ppm中都有,ppm也是最快捷的安装方式。其他方式我就不介绍了。
2.加载模块
use
DBI;
3.连接数据库,并得到一个文件句柄
my $user
= xx;
my
$password = 123456;
my
$dsn="DBI:mysql:database=db_name;host=localhost;port=3306";
#看到瘦箭头不要怕,这就是调用了模块DBI中的connect这个方法来连接数据库,方法connect的几个参数在后面的括号中给出,并用逗号隔开。下面是小骆驼中对于瘦箭头的描述:调用方法时的全名,应该由模块的名称(此处称为类或class)、一个瘦箭头(->)以及方法的简短名称构成。看到瘦箭头,就说明这是面向对象的写法,后面是要调用的方法名。
#$dbh表示数据库句柄
my $dbh
= DBI->connect($dsn, $user, $password,
{ RaiseError => 1, AutoCommit => 0 });
4.建表。
连接上数据库后,我们就可以建表了,语句跟直接在mysql中操作相同。
$dbh->do("DROP TABLE IF EXISTS
gene_list"); #如果名为gene_list的表存在,就删除该表。
#建表,该表只有两个字段。do()方法可以直接执行mysql语句,这是用perl来执行mysql语句的一种方法。
$dbh->do("CREATE
TABLE gene_list
(genesymbol VARCHAR(100),
regulation VARCHAR(50)
)") ;
5.导入数据。
表建好了,就可以向表里导入数据了。
#$sth表示语句句柄。这里用了prepare(语句准备),execute(执行)的方法,这是在perl中执行mysql语句的另一种方法。
#这里使用了INSERT语句来向表中导入数据。用while语句直接从输入句柄中得到数据。
#一些驱动器支持占位符和绑定值。这些驱动器允许数据库语句中包含占位符,某些时候也成为参数标记符,指示这些值将在随后提供。在下面的语句中"?"就是占位符,这两个占位符在后面使用$column1,$column2来提供具体的值。
######---------------------------------
my $input =
'gene_list.txt';
open INPUT, "<
$input" or die "cannot open $input: $!";
#######以上这两句用来打开句柄,并读入文件。是perl中的常规操作。
my $sth
= $dbh->prepare("INSERT INTO
gene_list(genesymbol,regulation) VALUES(?,?)");
while (){
chomp();
my ($column1,$column2) = split /t/,$_ ;
$sth->execute( $column1,$column2 );
}
#下面这个语句是必须的,不然无法导入数据。这个语句的具体含义还没有搞清楚,好像是重新连接数据库。
$dbh->commit || die $dbh->errstr;
#下面的语句用来去除导入数据的行尾换行符,其实有上面的chomp()函数,下面的语句是可以省略的。
my
$statement="UPDATE gene_list
SET regulation=REPLACE(regulation,'r','')";
my $rc = $dbh->do($statement) || die $dbh->errstr;
6.查询。
导入数据后,就可以进行相关的查询了。
#这里使用了prepare(),execute()的方式,如果使用do()的话,我们没有返回的句柄,将无法导出查询的值。
$sth =
$dbh->prepare("
SELECT a.*,b.*
FROM gene_list a,signal_net_hsa
b
WHERE a.genesymbol =
b.entry1
");
$sth->execute() or die "$DBI::errstrn";
7.导出查询结果。
my
@row; #定义一个数组来存入一整行的值。
#############------------------------
my
$output = 'relation.txt';
open OUTPUT, "> $output" or die "cannot open $output:
$!";
################以上这两句用来打开输出句柄,
#
fetchrow_array,作为一个字段数组取出下一行,这是固定用法
#将取出来的值存入数组@row,用while得到所有行的值,再由print输出。
while
(@row = $sth->fetchrow_array() ){
print OUTPUT
"$row[0]t$row[1]t$row[2]t$row[3]t$row[4]t$row[5]n" ;
}
#断开数据库连接,关闭文件句柄。
$dbh->disconnect();
close INPUT;
close OUTPUT;
以上为原创。
参考资料: