23.md 7.0 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10
# MySQL & Perl DBI

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

在 MySQL Perl 教程的第一章中,我们将介绍 Perl DBI 模块和 MySQL 数据库。 我们将提供一些定义并显示如何安装必要的元素。

## 先决条件

要使用本教程,我们必须安装 Perl 语言,MySQL 数据库,Perl DBI 和`DBD::MySQL`模块。 DBI 是标准的 Perl 数据库接口。 每个数据库都有其驱动程序。 在我们的例子中,`DBD::mysql`是 MySQL 数据库的驱动程序。

W
wizardforcel 已提交
11
```perl
W
wizardforcel 已提交
12 13 14 15 16 17 18 19 20 21
$ sudo perl -MCPAN -e shell
cpan> install DBI
cpan[2]> install DBD::mysql

```

上面的命令显示了如何安装 Perl DBI 和`DBD::mysql`模块。

## MySQL 数据库

W
wizardforcel 已提交
22
MySQL 是领先的开源数据库管理系统。 它是一个多用户,多线程的数据库管理系统。 MySQL 在网络上特别流行。 它是非常流行的 LAMP 平台的一部分,该平台由 Linux,Apache,MySQL 和 PHP 组成。 目前,MySQL 由 Oracle 拥有。 MySQL 数据库在最重要的 OS 平台上可用。 它运行在 BSD UNIX,LINUX,Windows 或 Mac OS。 维基百科和 YouTube 使用 MySQL。 这些站点每天管理数百万个查询。 MySQL 有两个版本:MySQL 服务器系统和 MySQL 嵌入式系统。
W
wizardforcel 已提交
23

W
wizardforcel 已提交
24
MySQL 随附`mysql`命令行工具。 它可用于对数据库发出 SQL 命令。 现在,我们将使用`mysql`命令行工具创建一个新数据库。
W
wizardforcel 已提交
25

W
wizardforcel 已提交
26
```perl
W
wizardforcel 已提交
27 28 29 30
$ sudo apt-get install mysql-server

```

W
wizardforcel 已提交
31
此命令将安装 MySQL 服务器和其他各种包。 在安装包时,提示我们输入 MySQL 根帐户的密码。 要从源代码安装 MySQL,请查看 [MySQL 安装](http://zetcode.com/databases/mysqltutorial/installation/)页面。
W
wizardforcel 已提交
32

W
wizardforcel 已提交
33
```perl
W
wizardforcel 已提交
34 35 36 37 38 39 40
$ service mysql status
mysql start/running, process 1238

```

我们检查 MySQL 服务器是否正在运行。 如果没有,我们需要启动服务器。

W
wizardforcel 已提交
41
```perl
W
wizardforcel 已提交
42 43 44 45
$ sudo service mysql start

```

W
wizardforcel 已提交
46
如果我们已经从包中安装了 MySQL 数据库,则上述命令是启动 MySQL 的常用方法。
W
wizardforcel 已提交
47

W
wizardforcel 已提交
48
```perl
W
wizardforcel 已提交
49 50 51 52
$ sudo -b /usr/local/mysql/bin/mysqld_safe

```

W
wizardforcel 已提交
53
上面的命令使用 MySQL 服务器启动脚本启动 MySQL 服务器。 我们启动 MySQL 服务器的方式可能有所不同。 这取决于我们是否从源代码或包安装了 MySQL,也取决于 Linux 发行版。 有关更多信息,请查阅 [MySQL 的第一步](http://zetcode.com/databases/mysqltutorial/firststeps/)或您的 Linux 发行版信息。
W
wizardforcel 已提交
54 55 56

接下来,我们将创建一个新的数据库用户和一个新的数据库。 我们使用`mysql`客户端。

W
wizardforcel 已提交
57
```perl
W
wizardforcel 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
+--------------------+
2 rows in set (0.00 sec)

```

W
wizardforcel 已提交
77
我们使用 mysql 监视器客户端应用连接到服务器。 我们使用根帐户连接到数据库。 我们用`SHOW DATABASES`语句显示所有可用的数据库。
W
wizardforcel 已提交
78

W
wizardforcel 已提交
79
```perl
W
wizardforcel 已提交
80 81 82 83 84 85 86
mysql> CREATE DATABASE mydb;
Query OK, 1 row affected (0.02 sec)

```

我们创建一个新的`mydb`数据库。 在整个教程中,我们将使用此数据库。

W
wizardforcel 已提交
87
```perl
W
wizardforcel 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
mysql> CREATE USER user12@localhost IDENTIFIED BY '34klq*';
Query OK, 0 rows affected (0.00 sec)

mysql> USE mydb;
Database changed

mysql> GRANT ALL ON mydb.* to user12@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
Bye

```

我们创建一个新的数据库用户。 我们授予该用户`mydb`数据库所有表的所有特权。

## Perl DBI

W
wizardforcel 已提交
106
Perl DBI(数据库接口)是用于 Perl 编程语言的数据库访问模块。 它定义了一组提供标准数据库接口的方法,变量和约定。 DBI 还负责驱动程序的动态加载,错误检查和处理,提供方法的默认实现以及许多其他非数据库特定的职责。 DBI 将方法调用分派到适当的数据库驱动程序。DBD(数据库驱动程序)是一个 Perl 模块,它转换特定数据库引擎的 DBI 方法。 数据库驱动程序由数据库供应商提供。
W
wizardforcel 已提交
107

W
wizardforcel 已提交
108
```perl
W
wizardforcel 已提交
109 110 111 112 113 114 115 116 117 118 119 120
#!/usr/bin/perl

use strict;
use DBI;

my @ary = DBI->available_drivers();
print join("\n", @ary), "\n";

```

该代码示例列出了系统上所有可用的驱动程序。

W
wizardforcel 已提交
121
```perl
W
wizardforcel 已提交
122 123 124 125 126 127
use DBI;

```

我们为脚本导入 DBI 模块。

W
wizardforcel 已提交
128
```perl
W
wizardforcel 已提交
129 130 131 132 133 134
my @ary = DBI->available_drivers();

```

`available_drivers()`类方法获取系统上所有当前可用的驱动程序。

W
wizardforcel 已提交
135
```perl
W
wizardforcel 已提交
136 137 138 139 140 141
print join("\n", @ary), "\n";

```

此行将驱动程序打印到控制台,每个驱动程序都在单独的行上。

W
wizardforcel 已提交
142
```perl
W
wizardforcel 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
$ ./available_drivers.pl 
DBM
ExampleP
File
Gofer
Proxy
SQLite
Sponge
mysql

```

示例输出。

## 常见的 DBI 方法

下表列出了一些常见的 DBI 方法。

| 方法名称 | 描述 |
| --- | --- |
| `available_drivers()` | 返回所有可用驱动程序的列表 |
| `connect()` | 建立与请求的数据源的连接 |
| `disconnect()` | 与数据库服务器断开连接 |
| `prepare()` | 准备要执行的 SQL 语句 |
W
wizardforcel 已提交
167
| `execute()` | 执行预备语句 |
W
wizardforcel 已提交
168
| `do()` | 准备并执行一条 SQL 语句 |
W
wizardforcel 已提交
169
| `bind_param()` | 在预备语句中将值与占位符关联 |
W
wizardforcel 已提交
170
| `bind_col()` | 将 Perl 变量绑定到`SELECT`语句的输出字段 |
W
wizardforcel 已提交
171
| `begin_work()` | 开始新事务 |
W
wizardforcel 已提交
172 173
| `commit()` | 将最新的一系列未提交的数据库更改写入数据库 |
| `rollback()` | 撤消最近一系列未提交的数据库更改 |
W
wizardforcel 已提交
174
| `quote()` | 引用字符串字面值,以用作 SQL 语句中的字面值 |
W
wizardforcel 已提交
175 176
| `dump_results()` | 获取所有行并打印 |
| `fetchrow_array()` | 获取下一行作为字段数组 |
W
wizardforcel 已提交
177
| `fetchrow_arrayref()` | 获取下一行作为字段的引用数组 |
W
wizardforcel 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
| `fetchrow_hashref()` | 获取下一行作为对哈希表的引用 |
| `fetchall_arrayref()` | 以数组的形式获取所有数据 |
| `finish()` | 完成声明并让系统释放资源 |
| `rows()` | 返回受影响的行数 |
| `column_info()` | 提供有关列的信息 |
| `table_info()` | 提供有关表的信息 |
| `primary_key_info()` | 提供有关表中主键的信息 |
| `foreign_key_info()` | 提供有关表中外键的信息 |

## 约定

在使用 Perl DBI 时,Perl 程序员通常使用以下变量名。 在本教程中,我们也将遵守这些约定。

| 变量名 | 描述 |
| --- | --- |
| `$dbh` | 数据库句柄对象 |
| `$sth` | 语句句柄对象 |
W
wizardforcel 已提交
195
| `$drh` | 驱动程序句柄对象(在应用中很少见或使用) |
W
wizardforcel 已提交
196 197
| `$h` | 上面的任何句柄类型(`$dbh``$sth``$drh`) |
| `$rc` | 通用返回码(布尔值:`true = ok``false = error`) |
W
wizardforcel 已提交
198 199
| `$rv` | 一般返回值(通常为整数) |
| `@ary` | 从数据库返回的值列表,通常是一行数据 |
W
wizardforcel 已提交
200
| `$rows` | 处理的行数(如果可用,否则为 -1) |
W
wizardforcel 已提交
201
| `$fh` | 文件句柄 |
W
wizardforcel 已提交
202
| `undef` | `NULL`值由 Perl 中的未定义值表示 |
W
wizardforcel 已提交
203 204 205
| `\%attr` | 引用传递给方法的属性值的哈希 |

MySQL Perl 教程的这一章介绍了 Perl DBI 模块和 MySQL 数据库。