使用 Perl 连接到 MySQL 数据库,本章将展示如何创建与数据库的连接。
第一步是连接到数据库。 我们使用connect()
DBI 方法建立连接。 disconnect()
方法用于关闭数据库连接。
$dbh = DBI->connect($dsn, $username, $password)
or die $DBI::errstr;
$dbh = DBI->connect($dsn, $username, $password, \%attr)
or die $DBI::errstr;
connect()
方法建立与请求的数据源的数据库连接。 如果连接成功,它将返回数据库句柄对象。 我们使用disconnect()
方法终止连接。
$dsn
是数据源名称。 它是一个字符串,告诉 Perl DBI 模块,应加载哪种驱动程序以及将要建立连接的数据库的位置。
dbi:DriverName:database_name
dbi:DriverName:database_name@hostname:port
dbi:DriverName:database=database_name;host=hostname;port=port
上面的字符串是 Perl DBI 中数据源名称的示例。
dbi:mysql:dbname=mydb
我们将使用此数据源名称。 dsn
始终以dbi:
子字符串开头。 然后我们有驱动程序名称。 在我们的情况下,驱动程序名称为mysql
。 第三部分是数据库名称。 在本教程中,我们将使用mydb
。
$username
和$password
是身份验证所需的用户名和密码。 最后一个参数是对哈希的引用,在哈希中,我们可以设置属性以更改连接的默认设置。 例如,RaiseError 属性可用于强制错误引发异常,而不是返回错误代码。 HandleError
属性可用于提供子程序,以防发生错误。 AutoCommit 属性设置或取消设置自动提交模式。
$DBI::errstr
是一个 DBI 动态属性,它返回本地数据库引擎错误消息。 如果连接失败,则会显示此消息,并且脚本将中止。
版本
在第一个代码示例中,我们将获取 MySQL 数据库的版本。
#!/usr/bin/perl
use strict;
use DBI;
my dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 },
) or dieDBI::errstr;
my sth =dbh->prepare("SELECT VERSION()");
sth->execute();
myver = sth->fetch();
print @ver;
print "\n";
sth->finish();dbh->disconnect();
在上面的 Perl 脚本中,我们连接到先前创建的mydb
数据库。 我们执行一条 SQL 语句,该语句返回 MySQL 数据库的版本。
use DBI;
我们使用 Perl DBI 模块连接到 MySQL 数据库。
my dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 },
) or dieDBI::errstr;
在这里,我们连接到mydb
数据库。 第一个参数是数据源名称。 在字符串中,我们指定数据库驱动程序和数据库名称。 第二个参数是用户名。 第三个参数是用户密码。 最后一个参数是数据库选项。 我们将RaiseError
选项设置为 1。这将导致引发异常,而不是返回错误代码。
my sth =dbh->prepare("SELECT VERSION()");
$sth->execute();
prepare()
方法准备一条 SQL 语句供以后执行。 execute()
方法执行 SQL 语句。
my ver =sth->fetch();
我们获取数据。
print @$ver;
print "\n";
我们将检索到的数据打印到控制台。
$sth->finish();
在这里,我们指示将不再从此语句句柄中获取任何数据。
$dbh->disconnect();
我们关闭与数据库的连接。
$ ./version.pl
5.1.62-0ubuntu0.11.10.1
执行 verion.pl 脚本,我们得到 MySQL 数据库的版本。
插入数据
我们将创建一个Cars
表并在其中插入几行。
#!/usr/bin/perl
use strict;
use DBI;
my dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12",
"34klq*",
{ RaiseError => 1}
) or dieDBI::errstr;
dbh->do("DROP TABLE IF EXISTS Cars");dbh->do("CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB");
dbh->do("INSERT INTO Cars VALUES(1,'Audi',52642)");dbh->do("INSERT INTO Cars VALUES(2,'Mercedes',57127)");
dbh->do("INSERT INTO Cars VALUES(3,'Skoda',9000)");dbh->do("INSERT INTO Cars VALUES(4,'Volvo',29000)");
dbh->do("INSERT INTO Cars VALUES(5,'Bentley',350000)");dbh->do("INSERT INTO Cars VALUES(6,'Citroen',21000)");
dbh->do("INSERT INTO Cars VALUES(7,'Hummer',41400)");dbh->do("INSERT INTO Cars VALUES(8,'Volkswagen',21600)");
$dbh->disconnect();
上面的脚本创建一个Cars
表,并将 8 行插入到该表中。
$dbh->do("CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB");
do()
方法执行 SQL 语句。 它将两个方法调用prepare()
和execute()
组合为一个调用。 do()
方法用于非选择语句。
$dbh->do("INSERT INTO Cars VALUES(1,'Audi',52642)");
$dbh->do("INSERT INTO Cars VALUES(2,'Mercedes',57127)");
这两行将两辆车插入桌子。 请注意,默认情况下,我们处于 自动提交模式,其中对表的所有更改均立即生效。
mysql> SELECT * FROM Cars;
+----+------------+--------+
| Id | Name | Price |
+----+------------+--------+
| 1 | Audi | 52642 |
| 2 | Mercedes | 57127 |
| 3 | Skoda | 9000 |
| 4 | Volvo | 29000 |
| 5 | Bentley | 350000 |
| 6 | Citroen | 21000 |
| 7 | Hummer | 41400 |
| 8 | Volkswagen | 21600 |
+----+------------+--------+
8 rows in set (0.01 sec)
这是我们已写入Cars
表的数据。
最后插入的行 ID
有时,我们需要确定最后插入的行的 ID。 在 Perl DBI 中,我们使用last_insert_id()
方法进行查找。
#!/usr/bin/perl
use strict;
use DBI;
my dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 },
) or dieDBI::errstr;
dbh->do("DROP TABLE IF EXISTS Friends");dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT)");
dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')");dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')");
dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')");dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')");
dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')");
myid = dbh->last_insert_id("", "", "Friends", "");
print "The last Id of the inserted row isid\n";
$dbh->disconnect();
我们创建一个新的Friends
表。 Id
自动递增。
$dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT)");
这是创建 Friends 表的 SQL 语句。 AUTO_INCREMENT
属性用于为新行生成唯一的 ID。
$dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')");
$dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')");
$dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')");
$dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')");
$dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')");
这五个 SQL 语句将五行插入到Friends
表中。
my id =dbh->last_insert_id("", "", "Friends", "");
使用last_insert_id()
方法,我们获得最后插入的行 ID。
$ ./last_rowid.pl
The last Id of the inserted row is 5
我们看到了脚本的输出。
取得数据
在本章的最后一个示例中,我们获取一些数据。 有关数据获取的更多信息将在“查询”一章中进行讨论。
#!/usr/bin/perl
use strict;
use DBI;
my dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 },
) or dieDBI::errstr;
my sth =dbh->prepare( "SELECT * FROM Cars WHERE Id=1" );
sth->execute();
my (id, name,price) = sth->fetchrow();
print "id nameprice\n";
my fields =sth->{NUM_OF_FIELDS};
print "We have selected fields field(s)\n";
myrows = sth->rows();
print "We have selectedrows row(s)\n";
sth->finish();dbh->disconnect();
在示例中,我们从Cars
表中获取一行。 我们还将找出我们选择了多少字段&行。
my sth =dbh->prepare( "SELECT * FROM Cars WHERE Id=1" );
$sth->execute();
我们使用prepare()
方法准备一条 SQL 语句。 SQL 字符串被发送到 MySQL 数据库引擎进行处理。 检查其语法和有效性。 该方法返回一个语句句柄。 然后执行 SQL 语句。 准备将数据发送到客户端程序。
my (id,name, price) =sth->fetchrow();
print "idname $price\n";
使用fetchrow()
方法从数据库中检索数据。 该方法以 Perl 列表的形式从表中返回一行。
my fields =sth->{NUM_OF_FIELDS};
NUM_OF_FIELDS
是一个语句句柄属性,它为我们提供了返回字段的数量。 在我们的情况下,我们返回了三个字段:Id
,Name
和Price
。
my rows =sth->rows();
我们得到选定的行数。 我们仅从表中检索到一行。 rows()
方法返回受影响的行数。 它可以用于SELECT
,UPDATE
和DELETE
SQL 语句。
$ ./fetchrow.pl
1 Audi 52642
We have selected 3 field(s)
We have selected 1 row(s)
fetchrow.pl 脚本的输出。