许多WEB应用程序内部通常重复运行带不同自变量的相同数据库查询,或以全有或全无块的形式执行一组相关查询。要满足这些要求,大多数数据库系统(包括MySQL)支持预编译查询与事务,多数脚本语言(如PHP和Perl)也拥有内置函数访问这些数据库特性。然而,上述两项特性是MySQL的新功能,因此给那些以前没有见过它们的开发者制造了一些麻烦。
本文旨在解决这一问题。文章讨论了支持MySQL事务和预编译查询的Perl DBI函数,并对其工作原理和应用方法进行说明。
预编译查询
在数据库中执行批量上传时,我们经常见到这样的SQL查询,这些查询仅在提交给INSERT命令的参数上有所不同。在这些情况下,应用所谓的预编译查询是一种常用的优化方法,它为查询建立一个模板,然后再向模板中导入不同的必要值,从而减少了数据库消耗。如果使用得当,这个特性能够显著提高应用程序的性能。
为说明这一点,我们以一个二域表格为例,如下面的列表A所示:
mysql> SELECT * FROM users;
+-------+--------+
| fname | lname|
+----------------+
| Joe| Blow|
+-------+--------+
1 row in set (0.09 sec)
|
列表A
现在,假设我需要通过INSERT查询向这个表格中输入一组新记录。很明显,每次运行时,查询的格式保持不变,只有输入的值发生变化。要完成这一操作,最佳方法是为INSERT查询建立一个内置DBI“占位符”的模板,然后在每次运行时用实际值来代替占位符。如列表B所示:
#!/usr/bin/perl
use DBI;
# create database connection
my $dbh = DBI->connect("DBI:mysql:database=somedb;
host=localhost", "user", "pass", {''RaiseError'' => 1});
# prepare template query
my $sth = $dbh->prepare
("INSERT INTO users (fname, lname) VALUES (?, ?)");
# execute query with first set of parameters
$sth->execute(''John'', ''Doe'');
# execute query with second set of parameters
$sth->execute(''Jane'', ''Low'');
# close connection
$dbh->disconnect();
|
列表B
建立并执行一个带Perl DBI预编译SQL查询共分四个简单的步骤:
首先调用connect()方法初始化一个数据库句柄。这个方法以一个字符串为连接参数,这个字符串中包括数据库类型(”mysql”)、主机名称(”localhost”)和数据库名称(”somedb”);并向connect()方法提供用户名(”user”)和密码(”pass”)作为第二和第三自变量。
调用prepare()函数建立SQL查询模板。prepare()中用到的问号为代替实际值的占位符。
调用execute()方法向查询预编译模板中输入实际数据值,把它提交给占位符代替的自变量。注意,这里自变量的顺序十分重要,在上一步中必须为每个占位符定义一个自变量。每次通过一组不同的自变量调用execute()方法,就用相应的值执行一次INSERT查询。
调用disconnect()方法结束会话。
从一个外部文件中批量插入数据,是上述查询的典型应用。这时,首先调用prepare()方法,然后应用一个循环从文件中读入数据,每运行一次循环,即调用execute()方法在数据库中插入一组值。
事务
事务支持是MySQL的另外一项重要的新特性。简单来说,事务就是一个以全有或全无方式执行的SQL语句块(因为这些语句彼此相互依赖)。事务中的所有语句必须全部成功执行,事务才能成功完成;如果有任何一个语句出现错误,系统就会“退回”到原始状态,以避免数据连接/破坏问题。
在两个银行账户间转账就是一个典型的例子。在数据库中,转账过程包括二个步骤:首先,从源账户余额中提取转账金额,然后将其存入目标账户的余额中。如果第二步发生错误,那么第一步必须倒退到一个前面的“快照”,以避免余额失衡。大部分数据库(包括MySQL)通过一组命令完成这种转账过程。
START TRANSACTION命令标记一个新事务块开始,接着执行一系列SQL命令。
COMMIT命令标记一个事务块结束,表示在事务中发生的所有变化应被“提交”或永久化。
ROLLBACK命令标记一个事务块结束,并表示事务中发生的所有变化必须被撤销。
为说明它的实际应用,我们以一个存储用户账户的表格为例,如列表C所示:
mysql> SELECT * FROM accounts;
+----+------------+---------+
| id | label| balance |
+----+------------+---------+
|1 | Savings #1 |1000 |
|2 | Current #1 |2000 |
|3 | Current #2 |3000 |
+----+------------+---------+
3 rows in set (0.34 sec)
|
列表C
现在,假设我要转账400美元。实际的“事务”通过两个UPDATE语句来执行,一个语句将转账金额从源账户中取出,另一语句将其存入目标账户。如果我只是在账户间进行转账,那么整个过程中,所有账户的总余额(00)应一直保持不变。以下是完成转账的DBI代码(列表D):
#!/usr/bin/perl
use DBI;
# create database connection
my $dbh = DBI->connect
("DBI:mysql:database=somedb;host=localhost",
"user", "pass", {''RaiseError'' => 1, ''AutoCommit'' => 0});
# trap errors using eval{}
eval {
# debit account #1
$dbh->do("UPDATE accounts SET balance = balance-400 WHERE id=1");
# credit account #2
$dbh->do("UPDATE accounts SET balance = balance+400 WHERE id=2");
# no errors so far
# commit changes
$dbh->commit();
};
# any errors
# rollback
if ($@) {
print "Transaction aborted: $@";
$dbh->rollback();
}
# close connection
$dbh->disconnect();
|
列表D
在Perl中执行一个事务共有四个基本步骤:
第一步,关闭数据库“自动提交”。(本质上说,自动提交意味着系统保存你所做的变化。)这一步很重要,因为你只应在确定所有的事务“单元”成功完成后,才保存发生的变化。在上面的例子中,我们在调用connect()方法时将AutoCommit选项设为0,完成关闭操作。
下一步,以普通方式执行INSERT、UPDATE和/或DELETE查询,但将这些查询包含在一个eval{}块中。这样做是为了保证:如果发生错误,程序会在块以外中断,事务就不会被提交。如果一切正常,发生的变化将在事务块中的所有查询执行后,通过调用commit()提交给数据库。
如果在执行事务块中任何一个语句时出现错误,程序将在eval{}块外中断,并继续执行后面的代码。这些代码首先打印一段错误信息,然后通过rollback()函数将数据库退回到事务前的状态。注意,一旦调用这个函数,事务即无法逆转。
调用disconnect()方法结束会话。
如你所见,用Perl和MySQL执行事务模型能够使MySQL数据库在遇到查询执行错误时更加稳定。但是,在新开始着手用这些新特性重写代码前,必须注意,它们实际上增加了系统的性能消耗;因此,在执行它们之前,最好进行一下成本效益分析。(T006)
要导入一批数据到数据库,使用DBI模块还是比较方便的
- #!/usr/bin/perl -w
- use DBI;
- use strict;
- my $dbh;
- my $INFILE=$ARGV[0];
- open LIST ,"<$INFILE" or die "can't open $INFILE\n";
- my $table="table_appinfo";
- $dbh=&connect();
- my $qurey=qq{insert into $table (ip,name,manage,dev,location) values(?,?,?,?,?) };
- my $sth=$dbh->prepare($qurey) || die $dbh->errstr;
- my $dev="lab";
- my $manage="namexxx";
- my $location='location';
- while(my $line=<LIST>){
- my ($ip,$name)=split /\s+/,$line;
- $sth->execute($ip,$name,$manage,$dev,$location);
- print "insert $ip $name\n";
-
}
- $dbh->disconnect();
分享到:
相关推荐
许多WEB应用程序内部通常重复运行带不同自变量的相同数据库查询,或以全有或全无块的形式 执行一组相关查询。...本文讨论了支持MySQL事务和预编译查询的Perl DBI函数,并对其工作原理和应用方法进行说明。
- **方法使用**:如`execute`执行预编译的SQL语句,`fetchrow_array`获取单行查询结果。 - **属性设置**:如`bind_param`用于绑定参数值。 #### 十三、其他重要知识点 - **占位符与绑定值**:介绍了如何安全地处理...
3. **执行SQL语句**:详细阐述如何通过DBI执行SELECT、INSERT、UPDATE、DELETE等SQL语句,以及如何处理批处理和预编译的SQL语句,以提高性能。 4. **结果集处理**:介绍如何获取和遍历查询返回的结果集,包括获取...
此外,还会涉及到事务管理和预编译语句,这些对于高效、安全的数据库操作至关重要。 "DBI类"和"处理器通用方法"章节会涵盖DBI的主要类和方法,比如`connect()`用于建立数据库连接,`prepare()`用于准备SQL语句,`...
2. **安装DBI**:在Linux环境下,确保你有权限执行安装操作,然后使用`perl Makefile.PL`命令创建Makefile,接着运行`make`和`make test`来编译和测试模块,最后使用`make install`将模块安装到你的Perl库路径中。...
3. **预编译SQL**:提高性能,减少解析时间。 4. **动态SQL**:通过`$sth->prepare("SELECT * FROM $table")`动态构建SQL语句。 #### 五、错误处理 Perl-DBI提供了强大的错误处理机制,可以通过`$dbh->errstr`获取...
Perl DBI提供了丰富的功能,简化了数据库操作,并且具有高度的灵活性和可扩展性。通过理解和熟练使用这些方法,开发者可以高效地处理各种数据库任务。无论是在小型脚本还是大型应用程序中,DBI都是Perl数据库编程的...
总之,Perl DBI是Perl开发者与数据库交互的重要工具,它简化了数据库编程,增强了代码的可移植性,并且具有强大的功能和广泛的支持。这个"perl-DBI-1.40-5.i386.rar"压缩包对于需要在32位Linux环境下使用Perl处理...
在使用DBD-mysql时,你需要先安装这个模块,然后在Perl脚本中通过DBI的connect()方法建立到MySQL服务器的连接,之后可以使用prepare()、execute()等方法来执行SQL查询。 例如,以下是一个简单的使用DBD-mysql的例子...
这个基础的Perl DBI示例演示了数据库连接的基本流程,但实际应用中,你可能需要处理更多复杂的情况,例如错误处理、事务管理、预编译的SQL语句等。在Perl中,你可以利用DBI模块的特性来实现这些功能,如使用`prepare...
在本教程中,我们将详细介绍如何在Linux下安装DBI和其MySQL驱动DBD::mysql,以及编写Perl脚本来操作MySQL数据库。 首先,让我们了解DBI。DBI是Perl中用于数据库操作的核心模块,它定义了一组标准的数据库访问方法和...
DBD-mysql-4.046.tar.gz是这个驱动的源码包,它提供了连接、查询、事务处理等功能,使得Perl可以通过DBI调用,无缝地与MySQL进行交互。在Linux环境下,要建立Perl到MySQL的连接,必须先安装DBD-mysql。 安装这些...
以下是一些使用Perl DBI操作MySQL时的重要建议和注意事项: 1. **字符集设置**: 当MySQL数据库的字符集设置为UTF8时,为了确保数据的正确读取和显示,Perl脚本也需要进行相应的配置。引入`use utf8;`声明源代码中...
5.事务处理:DBD-Mysql支持事务管理,包括开始事务、提交事务和回滚事务,以确保数据的一致性和完整性。 6. 错误处理和调试:当发生错误时,DBD-Mysql会返回错误代码和消息,帮助开发者定位问题。同时,它还提供了...
DBI(Database Interface)是Perl编程语言中的标准数据库接口模块,它为Perl程序员提供了一种统一的方式来访问和支持各种类型的数据库。DBI-1.631是DBI的一个特定版本,该版本包含了对数据库操作的各种增强和改进。...
DBD-mysql支持各种高级特性,如事务处理、存储过程调用、预编译语句和绑定参数等。这些功能使得在Perl中使用MySQL数据库变得非常灵活和高效。 总的来说,DBD-mysql-4.019.tar.gz是Perl开发人员连接和操作MySQL...
要安装DBI,首先需要解压"DBI-1.616.tar.gz",然后进入解压后的目录并运行`perl Makefile.PL`,接着执行`make`和`make test`进行编译和测试,最后使用`make install`将DBI安装到系统中。在完成安装后,Perl程序就...
解压后,你可以找到DBI的源文件,用于编译和安装到你的Perl环境中。通常,这样的源码包会包括如下几个部分: 1. `INSTALL`:提供了安装指南,指导用户如何编译和安装模块。 2. `Makefile.PL`:Perl的Makefile生成...