2010-05-25 18 views
6

Estoy usando Perl DBI. Sé que $dbase->tables() devolverá todas las tablas en la base de datos correspondiente. Del mismo modo, quiero saber los esquemas disponibles en la base de datos. ¿Hay alguna función disponible para eso?¿Cómo obtengo los esquemas de DBI de Perl?

+0

http://dbi.perl.org/ – Ether

Respuesta

11

Lo que estamos buscando es: DBI->table_info()

Llamada así:

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

Escribí un script basado en esta idea ayer, pero 'DBI :: ODBC' no admite' table_info', y necesito acceso a '* .mdb'. – reinierpost

+0

PD: ¡sí lo admite cuando los primeros dos argumentos son undef! – reinierpost

+0

DBD :: ODBC ciertamente soporta table_info. Necesita leer las especificaciones ODBC para lo que necesita pasar a table_info. También puede necesitar la corrección de errores en 1.46_1 - vea http://search.cpan.org/~mjevans/DBD-ODBC-1.46_2/Changes#1.46_1_2013-11-16 – bohica

1

Esto funciona.

Crear una base de datos:

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

programa de Perl para imprimir esquema:

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); 
    } 
} 

Salida:

*** 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

Uso de ODBC para una base de datos Oracle, he tenido que utilizar esta variación en la respuesta del tío 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"; 

De lo contrario, $schemas sería indefinido cuando se intenta utilizar selectcol_arrayref($sth, ...).

Cuestiones relacionadas