2010-05-25 58 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將是不確定的。