# 使用 Perl 获取 MySQL 元数据

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

元数据是有关数据库中数据的信息。 MySQL 中的元数据包含有关存储数据的表和列的信息。 受 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也属于元数据。

| 方法名称 | 描述 |
| --- | --- |
| `column_info()` | 提供有关列的信息 |
| `table_info()` | 提供有关表的信息 |
| `primary_key_info()` | 提供有关表中主键的信息 |
| `foreign_key_info()` | 提供有关表中外键的信息 |

上表列出了四种用于检索元数据的 Perl DBI 方法。

```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->primary_key_info(undef, "mydb", "Cars");
my @ary = $sth->fetchrow_array();

print join(" ", @ary), "\n";

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

```

在第一个示例中，我们将在`Cars`表中找到有关主键的信息。

```perl
my $sth = $dbh->primary_key_info(undef, "main", "Cars");

```

`primary_key_info()`返回一个活动语句句柄，该句柄可用于获取有关构成表主键的列的信息。

```perl
my @ary = $sth->fetchrow_array();

```

从语句句柄，我们检索信息。

```perl
$ ./pk_info.pl
 mydb Cars Id 1 PRIMARY

```

从输出中我们可以看到`Cars`表中有一个主键。 主键是第一列，名为`Id`。

接下来，我们将打印`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;

my $sth = $dbh->prepare( "SELECT * FROM Cars LIMIT 8" );  
$sth->execute();

my $headers = $sth->{NAME};

my ($id, $name, $price) = @$headers;
printf  "%s %-10s %s\n", $id, $name, $price;

my $row;
while($row = $sth->fetchrow_hashref()) {
    printf "%2d %-10s %d\n", $row->{Id}, $row->{Name}, $row->{Price};
}

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

```

我们将`Cars`表的内容打印到控制台。 现在，我们也包括列的名称。 记录与列名对齐。

```perl
my $headers = $sth->{NAME};

```

我们从语句对象获得列名。

```perl
my ($id, $name, $price) = @$headers;
printf "%s %-10s %s\n", $id, $name, $price;

```

列名将打印到控制台。 我们使用`printf`函数应用某些格式。

```perl
my $row;
while($row = $sth->fetchrow_hashref()) {
    printf "%2d %-10s %d\n", $row->{Id}, $row->{Name}, $row->{Price};
}

```

数据被检索，格式化并打印到终端。

```perl
$ ./column_names.pl
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 21601

```

`column_names.pl`脚本的输出。

在与元数据有关的最后一个示例中，我们将列出`test.db`数据库中的所有表。

```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 @tables = $dbh->tables(); 

foreach my $table ( @tables ) {
     print "Table: $table\n"; 
}

$dbh->disconnect();

```

该代码示例将当前数据库中的所有可用表打印到终端。

```perl
my @tables = $dbh->tables();

```

表名使用`tables()`方法检索。

```perl
$ ./list_tables.pl
Table: `mydb`.`Cars`
Table: `mydb`.`Friends`
Table: `mydb`.`Images`

```

这些是我们系统上的表。

在 MySQL Perl 教程的这一部分中，我们使用了数据库元数据。