Я использую Perl DBI. Я знаю, что $dbase->tables()
вернет все таблицы в соответствующей базе данных. Точно так же я хочу знать схемы, доступные в базе данных. Есть ли какая-нибудь функция для этого?
Как получить схемы из DBI Perl?
Ответы (3)
Что вам нужно: DBI->table_info()
Назовите это так:
my $sth = $dbh->table_info('', '%', '');
my $schemas = $dbh->selectcol_arrayref($sth, {Columns => [2]});
print "Schemas: ", join ', ', @$schemas;
person
Uncle Arnie
schedule
25.05.2010
Вчера я написал сценарий, основанный на этой идее, но
DBI::ODBC
не поддерживает table_info
, а мне нужен доступ к *.mdb
.
- person reinierpost; 23.02.2011
PS: он поддерживает его, когда первые два аргумента равны undef!
- person reinierpost; 19.06.2012
DBD::ODBC определенно поддерживает table_info. Вам нужно прочитать спецификацию ODBC для того, что вам нужно передать в table_info. Вам также может понадобиться исправление ошибки в версии 1.46_1 — см. search.cpan.org/~mjevans/DBD-ODBC-1.46_2/
- person bohica; 14.02.2014
Это работает.
Создайте базу данных:
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
};
person
daxim
schedule
25.05.2010
Используя ODBC для базы данных Oracle, мне пришлось использовать этот вариант ответа дяди Арни:
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
будет неопределенным при попытке использовать selectcol_arrayref($sth, ...)
.
person
mivk
schedule
18.12.2016