如何从Perl的DBI获取模式?

6

我正在使用Perl的DBI。我知道$dbase->tables()会返回相应数据库中的所有表。同样,我想知道数据库中可用的模式。是否有可用于此的函数?

3个回答

11

你需要的是:DBI->table_info()

这样调用它:

my $sth = $dbh->table_info('', '%', '');
my $schemas = $dbh->selectcol_arrayref($sth, {Columns => [2]});
print "Schemas: ", join ', ', @$schemas;

我昨天基于这个想法写了一个脚本,但是 DBI::ODBC 不支持 table_info,而我需要访问一个 *.mdb 文件。 - reinierpost
PS:当前两个参数未定义时,它是支持的! - reinierpost
DBD::ODBC确实支持table_info。您需要阅读ODBC规范以了解需要传递给table_info的内容。您可能还需要1.46_1中的错误修复-请参见http://search.cpan.org/~mjevans/DBD-ODBC-1.46_2/Changes#1.46_1_2013-11-16。 - bohica

1

这个有效。

创建一个数据库:

echo 'create table foo (bar integer primary key, quux varchar(30));' | sqlite3 foobar.sqlite

Perl程序打印模式:
use 5.010;
use Data::Dumper qw(Dumper);
use DBIx::Class::Schema::Loader qw();
DBIx::Class::Schema::Loader->naming('current');
DBIx::Class::Schema::Loader->use_namespaces(1);

my $dbi_dsn = 'dbi:SQLite:dbname=foobar.sqlite';
my ($dbi_user, $dbi_pass);
my $schema = DBIx::Class::Schema::Loader->connect(
    $dbi_dsn, $dbi_user, $dbi_pass, {'AutoCommit' => 1, 'RaiseError' => 1,}
);

for my $source_name ($schema->sources) {
    say "*** Source: $source_name";
    my $result_source = $schema->source($source_name);
    for my $column_name ($result_source->columns) {
        say "Column: $column_name";
        say Dumper $result_source->column_info($column_name);
    }
}

输出:

*** Source: Foo
Column: bar
$VAR1 = {
          'data_type' => 'integer',
          'is_auto_increment' => 1,
          'is_nullable' => 1
        };

Column: quux
$VAR1 = {
          'data_type' => 'varchar',
          'is_nullable' => 1,
          'size' => 30
        };

0

使用ODBC连接Oracle数据库时,我不得不使用这个变体来自于Uncle Arnie的答案:

my $table_info = $dbh->table_info(undef, '%', undef);
my $schemas    = $table_info->fetchall_arrayref([1]);

print "Schemas :\n",
      join( "\n", map {$_->[0]} @$schemas ), "\n";

否则,当尝试使用 selectcol_arrayref($sth, ...) 时,$schemas 将未定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接