Perl
+ -

Perl 数据库连接

2019-09-09 0 0

本章节我们将为大家介绍 Perl 数据库的连接。

Perl 5 中我们可以使用 DBI 模块来连接数据库。

DBI 英文全称:Database Independent Interface,中文称为数据库独立接口。

DBI 作为 Perl 语言中和数据库进行通讯的标准接口,它定义了一系列的方法,变量和常量,提供一个和具体数据库平台无关的数据库持久层。

DBI 结构

DBI 和具体数据库平台无关,我们可以将其应用在Oracle, MySQL 或 Informix, 等数据库中。
DBI 结构

图表中 DBI 获取所有 API(Application Programming Interface:应用程序接口) 发送过来的 SQL数据,然后分发到对应的驱动上执行,最后再获取数据返回。

变量名约定

以下设置了比较常用的变量名命名方法:

$dsn    驱动程序对象的句柄
$dbh    一个数据库对象的句柄
$sth    一个语句或者一个查询对象的句柄
$h      通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文
$rc     操作代码返回的布什值(true 或 false)
$rv     操作代码返回的整数值
@ary    查询返回的一行值的数组(列表)
$rows   操作代码返回的行数值
$fh     文件句柄
undef   NULL 值表示未定义
\%attr  引用属性的哈希值并传到方法上

数据库连接

接下来我们以 MySQL 数据库为例演示 Perl 是如何对数据库进行操作的。

这里我们在 MySQL 数据库创建 bytekits 数据库,数据表为 Websites,表结构及数据如下图所示:

接下来我们使用以下代码来连接数据库:

实例

#!/usr/bin/perl -w
use strict;
use DBI;
my $host = "localhost";         # 主机地址
my $driver = "mysql";           # 接口类型 默认为 localhost
my $database = "bytekits";        # 数据库
# 驱动程序对象的句柄
my $dsn = "DBI:$driver:database=$database:$host";  
my $userid = "root";            # 数据库用户名
my $password = "123456";        # 数据库密码
# 连接数据库
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM Websites");   # 预处理 SQL  语句
$sth->execute();    # 执行 SQL 操作
# 注释这部分使用的是绑定值操作
# $alexa = 20;
# my $sth = $dbh->prepare("SELECT name, url
#                        FROM Websites
#                        WHERE alexa > ?");
# $sth->execute( $alexa ) or die $DBI::errstr;
# 循环输出所有数据
while ( my @row = $sth->fetchrow_array() )
{
       print join('\t', @row)."\n";
}
$sth->finish();
$dbh->disconnect();

插入操作

执行步骤:

  • 使用 prepare() API 预处理 SQL 语句。
  • 使用 execute() API 执行 SQL 语句。
  • 使用 finish() API 释放语句句柄。
  • 最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, conutry )
                        values
                       ('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

应用程序还可以绑定输出和输入参数,下面例子通过用变量 取代 ? 占位符的位置来执行一条插入查询:

my $name = "Twitter";
my $url = "https://twitter.com/";
my $alexa = 10;
my $conutry = "USA";
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, conutry )
                        values
                       (?,?,?,?)");
$sth->execute($name,$url,$alexa, $conutry) 
          or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

更新操作

执行步骤:

  • 使用 prepare() API 预处理 SQL 语句。
  • 使用 execute() API 执行 SQL 语句。
  • 使用 finish() API 释放语句句柄。
  • 最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

应用程序还可以绑定输出和输入参数,下面例子通过用变量取代 ? 占位符的位置来执行一条更新查询:

$name = '字节流';
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

当然我们也可以绑定要设置的值,如下所示将 country 为 CN 的 alexa 都修改为 1000:

$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = ?
                        WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

删除数据

执行步骤:

  • 使用 prepare() API 预处理 SQL 语句。
  • 使用 execute() API 执行 SQL 语句。
  • 使用 finish() API 释放语句句柄。
  • 最后如果一切顺利就会提交以上执行操作。

以下数据将 Websites 中 alexa 大于 1000 的数据都删除:

$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites
                        WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

使用 do 语句

do 语句可以执行 UPDATE, INSERT, 或 DELETE 操作,使用他比较简短,执行成功返回true,执行失败返回
false,实例如下:

$dbh->do('DELETE FROM Websites WHERE alexa>1000');

COMMIT 操作

commit 为提交事务,完成数据库的操作:

$dbh->commit or die $dbh->errstr;

ROLLBACK 操作

如果在 SQL 执行过程中发生错误,可以回滚数据,不做任何改变:

$dbh->rollback or die $dbh->errstr;

事务

和其它的语言一样, perl DBI对数据库的操作也支持事务处理, 它的实现方式有两个:

1、 在连接数据库的时候就开始一个事务

$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;

以上代码在连接的时候设置了AutoCommit为false, 也就是说当你对数据库进行更新操作的时候, 它不会自动地把那些更新直接写到数据库里,而是要程序通过 $dbh->commit 来使数据真正地写到数据库里, 或 $dbh->rollback 来回滚刚才的操作。

2、 通过$dbh->begin_work()语句来开始一个事务

这种方式就不需要在连接数据库的时候设置 AutoCommit = 0 。

可以一次数据库连接进行多次事务操作, 不用每一次事务的开始都去连接一次数据库。

$rc  = $dbh->begin_work  or die $dbh->errstr;
#####################
##这里执行一些 SQL 操作
#####################
$dbh->commit;    # 成功后操作
-----------------------------
$dbh->rollback;  # 失败后回滚

断开数据库连接

如果我们需要断开数据库连接,可以使用 disconnect API:

$rc = $dbh->disconnect  or warn $dbh->errstr;

0 篇笔记 写笔记

SQLite 简介
SQLite是一个轻型的数据库,无需任何服务,无需任何配置的绿色数据库SQLite是一个进程内库,它实现了一个自包含、无服务器、零配置、事务性SQL数据库引擎。SQLite的代码在公共域中,因此可以免费用于任何目的,无论是商业还是私有。SQLite是世界上部署最广泛的数据库,其应用程序比我们所能统......
SQLite 数据插入insert into
和常用数据库一致,SQLite也提供insert SQL语句用于向数据库的表中添加新的数据记录。语法INSERT INTO table_name [(col_name1,col_name2,...col_nameN)]values (value1,value2,...,value2),.........
C# while 循环
只要给定的条件为真,C# 中的 while 循环语句会重复执行一个目标语句。语法C# 中 while 循环的语法:while(condition){ statement(s);}在这里, statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。 condition可以是任意......
Perl 引用
引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。创建引用定义变量的时候,在变量名前面加个,就得到了这个变量的一个引用,比如:$scalarref = $foo; # 标量变量引用$arrayref = @ARG......
Nginx PHP7+MySQL5.7(LNMP)环境配置
在前面几篇文章中,我们已经介绍并演示安装 Nginx的几种方式,在开始本篇文章的阅读和实践之前,建议先阅读”Nginx安装配置”:http://www.bytekits.com/nginx/nginx-install.html ,在上面文章的基础之上,我们再添加 PHP7 的安装配置以及MySQL的......
SQL INSERT INTO
INSERT INTO 语句用于向表格中插入新的行。语法INSERT INTO 表名称 VALUES (值1, 值2,....)我们也可以指定所要插入数据的列:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)插入新的行“Persons”......
PHP MySQL Order By排序
PHP mysql_query()函数用于使用order by子句执行select查询将结果集排序。 由于从PHP5.5版本起,不推荐使用mysql_query()函数。 现在,建议使用以下2种替代方法之一。mysqli_query()PDO::__query()order by子句可用于按列升序或......
MySQL 连接join
在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来......
MySQL PHP语法
MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,Mysql在PHP的web开发中是应用最广泛。在本教程中我们大部分实例都采用了 PHP 语言。如果你想了解 Mysql 在 PHP 中的应用,可以访问我们的 PHP教程。PHP提供了多种方式来访问和......
SQL SELECT DISTINCT
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 DISTINCT 用于返回唯一不同的值。语法:SELECT DISTINCT 列名称 FROM 表名称使用 DISTINCT 关键词如果要从 “Company” 列中选取所有的值,我们需要使用 ......
SQL LEFT JOIN
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。LEFT JOIN 关键字语法SELECT column_name(s)FROM table_name1LEFT JOIN table_name2 ON tabl......
MySQL 删除数据表
MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。语法以下为删除MySQL数据表的通用语法:DROP TABLE table_name ;在命令提示窗口中删除数据表在mysql>命令提示窗口中删除数据表SQL语句为 DROP TA......
C# for/foreach 循环
一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。语法C# 中 for 循环的语法:for ( init; condition; increment ){ statement(s);}下面是 for 循环的控制流:init 会首先被执行,且只会执行一次。这一步允许您声明并初......
GO语言 循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。以下为大多编程语言循环程序的流程图:Go 语言提供了以下几种类型循环处理语句:循环类型描述 for 循环重复执行语句块 循环嵌套在 for 循环中嵌套一个或多个 for 循环 循环控制语句循环控制语句可以控制循环体......
SQLite 条件语句where
一般的SQL语句如不加限制条件,默认是结全表进行操作,这显然不是我们想要的。我们需要的是对满足某个条件的数据记录进行操作。而这个条件就是通过where语句来实现的。SQLite条件语句where用于过滤相关的sql操作结果。用于select语句查询结果的过滤用于update语句更新数据的过滤用于de......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!