2010-05-25 78 views
6

我正在使用Perl DBI。我知道$dbase->tables()将返回相应数据库中的所有表。同样,我想知道数据库中可用的模式。有没有可用的功能?如何从Perl的DBI获取模式?

+0

http://dbi.perl.org/ – Ether 2010-05-25 14:53:37

回答

11

什么你要找的是:DBI->table_info()

这样称呼它:

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

我昨天写了一个基于这个想法的脚本,但'DBI :: ODBC'不支持'table_info',我需要访问'* .mdb'。 – reinierpost 2011-02-23 13:01:13

+0

PS:当前两个参数是undef时它支持它! – reinierpost 2012-06-19 12:35:29

+0

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 2014-02-14 09:00:28

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数据库,我不得不使用上阿尼叔叔的回答这种变化:尝试使用selectcol_arrayref($sth, ...)

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

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

否则,$schemas将是不确定的。