# 使用 Perl 连接到 MySQL 数据库

> 原文： [http://zetcode.com/db/mysqlperl/connect/](http://zetcode.com/db/mysqlperl/connect/)

MySQL Perl 教程的这一部分将展示如何创建与数据库的数据库连接。

第一步是连接到数据库。 我们使用`connect()` DBI 方法建立连接。 `disconnect()`方法用于关闭数据库连接。

```perl
$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 模块，应加载哪种驱动程序以及将要建立连接的数据库的位置。

```perl
dbi:DriverName:database_name
dbi:DriverName:database_name@hostname:port
dbi:DriverName:database=database_name;host=hostname;port=port

```

上面的字符串是 Perl DBI 中数据源名称的示例。

```perl
dbi:mysql:dbname=mydb

```

我们将使用此数据源名称。 `dsn`始终以`dbi:`子字符串开头。 然后我们有驱动程序名称。 在我们的情况下，驱动程序名称为`mysql`。 第三部分是数据库名称。 在本教程中，我们将使用`mydb`。

`$username`和`$password`是认证所需的用户名和密码。 最后一个参数是对哈希的引用，在哈希中，我们可以设置属性以更改连接的默认设置。 例如，`RaiseError`属性可用于强制错误引发异常，而不是返回错误代码。 `HandleError`属性可用于提供子程序，以防发生错误。 `AutoCommit`属性设置或取消设置自动提交模式。

`$DBI::errstr`是一个 DBI 动态属性，它返回本地数据库引擎错误消息。 如果连接失败，则会显示此消息，并且脚本将中止。

## 版本

在第一个代码示例中，我们将获取 MySQL 数据库的版本。

```perl
#!/usr/bin/perl

use strict;
use DBI;

my $dbh = DBI->connect(          
    "dbi:mysql:dbname=mydb", 
    "user12",                          
    "34klq*",                          
    { RaiseError => 1 },         
) or die $DBI::errstr;

my $sth = $dbh->prepare("SELECT VERSION()");
$sth->execute();

my $ver = $sth->fetch();

print @$ver;
print "\n";

$sth->finish();
$dbh->disconnect();

```

在上面的 Perl 脚本中，我们连接到先前创建的`mydb`数据库。 我们执行一条 SQL 语句，该语句返回 MySQL 数据库的版本。

```perl
use DBI;

```

我们使用 Perl DBI 模块连接到 MySQL 数据库。

```perl
my $dbh = DBI->connect(          
    "dbi:mysql:dbname=mydb", 
    "user12",                          
    "34klq*",                          
    { RaiseError => 1 },         
) or die $DBI::errstr;

```

在这里，我们连接到`mydb`数据库。 第一个参数是数据源名称。 在字符串中，我们指定数据库驱动程序和数据库名称。 第二个参数是用户名。 第三个参数是用户密码。 最后一个参数是数据库选项。 我们将`RaiseError`选项设置为 1。这将导致引发异常，而不是返回错误代码。

```perl
my $sth = $dbh->prepare("SELECT VERSION()");
$sth->execute();

```

`prepare()`方法准备一条 SQL 语句供以后执行。 `execute()`方法执行 SQL 语句。

```perl
my $ver = $sth->fetch();

```

我们获取数据。

```perl
print @$ver;
print "\n";

```

我们将检索到的数据打印到控制台。

```perl
$sth->finish();

```

在这里，我们指示将不再从此语句句柄中获取任何数据。

```perl
$dbh->disconnect();

```

我们关闭与数据库的连接。

```perl
$ ./version.pl
5.1.62-0ubuntu0.11.10.1

```

执行`verion.pl`脚本，我们得到 MySQL 数据库的版本。

## 插入数据

我们将创建一个`Cars`表并在其中插入几行。

```perl
#!/usr/bin/perl

use strict;
use DBI;

my $dbh = DBI->connect(          
    "dbi:mysql:dbname=mydb", 
    "user12",
    "34klq*",
    { RaiseError => 1}
) or die $DBI::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 行插入到该表中。

```perl
$dbh->do("CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB");

```

`do()`方法执行 SQL 语句。 它将两个方法调用`prepare()`和`execute()`组合为一个调用。 `do()`方法用于非选择语句。

```perl
$dbh->do("INSERT INTO Cars VALUES(1,'Audi',52642)");
$dbh->do("INSERT INTO Cars VALUES(2,'Mercedes',57127)");

```

这两行将两辆车插入表。 请注意，默认情况下，我们处于自动提交模式，其中对表的所有更改均立即生效。

```perl
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()`方法进行查找。

```perl
#!/usr/bin/perl

use strict;
use DBI;

my $dbh = DBI->connect(          
    "dbi:mysql:dbname=mydb", 
    "user12",                          
    "34klq*",                          
    { RaiseError => 1 },         
) or die $DBI::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')");

my $id = $dbh->last_insert_id("", "", "Friends", "");
print "The last Id of the inserted row is $id\n";

$dbh->disconnect();

```

我们创建一个新的`Friends`表。 `Id`自动递增。

```perl
$dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT)");

```

这是创建`Friends`表的 SQL 语句。 `AUTO_INCREMENT`属性用于为新行生成唯一的 ID。

```perl
$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`表中。

```perl
my $id = $dbh->last_insert_id("", "", "Friends", "");

```

使用`last_insert_id()`方法，我们获得最后插入的行 ID。

```perl
$ ./last_rowid.pl
The last Id of the inserted row is 5

```

我们看到了脚本的输出。

## 取得数据

在本章的最后一个示例中，我们获取一些数据。 有关数据获取的更多信息将在“查询”一章中进行讨论。

```perl
#!/usr/bin/perl

use strict;
use DBI;

my $dbh = DBI->connect(          
    "dbi:mysql:dbname=mydb", 
    "user12",                          
    "34klq*",                          
    { RaiseError => 1 },         
) or die $DBI::errstr;

my $sth = $dbh->prepare( "SELECT * FROM Cars WHERE Id=1" );  
$sth->execute();

my ($id, $name, $price) = $sth->fetchrow();
print "$id $name $price\n";

my $fields = $sth->{NUM_OF_FIELDS};
print "We have selected $fields field(s)\n";

my $rows = $sth->rows();
print "We have selected $rows row(s)\n";

$sth->finish();
$dbh->disconnect();

```

在示例中，我们从`Cars`表中获取一行。 我们还将找出我们选择了多少字段&行。

```perl
my $sth = $dbh->prepare( "SELECT * FROM Cars WHERE Id=1" );  
$sth->execute();

```

我们使用`prepare()`方法准备一条 SQL 语句。 SQL 字符串被发送到 MySQL 数据库引擎进行处理。 检查其语法和有效性。 该方法返回一个语句句柄。 然后执行 SQL 语句。 准备将数据发送到客户端程序。

```perl
my ($id, $name, $price) = $sth->fetchrow();
print "$id $name $price\n";

```

使用`fetchrow()`方法从数据库中检索数据。 该方法以 Perl 列表的形式从表中返回一行。

```perl
my $fields = $sth->{NUM_OF_FIELDS};

```

`NUM_OF_FIELDS`是一个语句句柄属性，它为我们提供了返回字段的数量。 在我们的情况下，我们返回了三个字段：`Id`，`Name`和`Price`。

```perl
my $rows = $sth->rows();

```

我们得到选定的行数。 我们仅从表中检索到一行。 `rows()`方法返回受影响的行数。 它可以用于`SELECT`，`UPDATE`和`DELETE` SQL 语句。

```perl
$ ./fetchrow.pl
1 Audi 52642
We have selected 3 field(s)
We have selected 1 row(s)

```

`fetchrow.pl`脚本的输出。

在 MySQL Perl 教程的这一章中，我们展示了如何建立与 MySQL 数据库的数据库连接。 我们已经解释了对数据库进行一些基本工作的脚本。