如何使用Perl $ dbh->表获取每个表的单行?

时间:2013-07-15 15:25:54

标签: perl sqlite dbi

我希望像.schema一样检索sqlite数据库架构信息但是使用Perl DBI。第一次尝试是使用$dbh->tables检索表名,但我获得了重复的表名。它们是表本身的一个条目,每个索引有一个条目(table_a有3个索引,b一个)这背后的基本原理是什么?

DB<7> x $dbh->tables;
0  '"main"."table_a"'
1  '"main"."table_a"'
2  '"main"."table_a"'
3  '"main"."table_b"'
4  '"main"."sqlite_master"'
5  '"temp"."sqlite_temp_master"'
6  '"main"."table_a"'
7  '"main"."table_b"'

我希望有人可以提出这三个相关问题的提示: 如何只获取表(不做uniq)以及为什么每个索引都有一行? 我如何获取索引信息? 和所有在一起,如何获得.schema的等效信息?

[upate]我在DBI 1.627

看到了这一点
@names = $dbh->tables;        # deprecated

但它没有提到原因。

他们建议使用

@names = $dbh->tables( $catalog, $schema, $table, $type );

但是在阅读了DBI table_info之后,解释了这个参数,我还没有完全理解如何填充它们以获取表的信息只获取一次表名或者是否可以拥有它,与.schema相同的信息。

任何有关更详细用法的示例或链接都将受到赞赏。

[[UPDATE]]
仅仅是为了将来参考,这两个问题阻止了我在这里问之前自己找到答案:

1- google将我引导到一个非常旧的DBD-sqlite文档页面,其中几乎没有任何内容,我没有注意到页面顶部最新版本的链接。

2-在问这里之前,我在其他主题中读到了关于table_info(正确的答案),但是在没有编写DBI代码的情况下几年我就陷入了一个新手陷阱。由于$ dbh-&gt;表返回一个数组,我没注意table_info返回一个语句处理程序,因此当在调试器中尝试x $dbh->table_info(...)并获得一个空哈希时,我被卡住了。我忘了需要将获取部分调用到$ sth返回。

2 个答案:

答案 0 :(得分:3)

  

如何只获取表格(不做uniq)

我猜,$dbh->tables接口过于简单,代表了SQL引擎和各种驱动程序的复杂性。如您所知,您应该使用table_info()代替。

特别是,请参阅DBD::SQLite documentation for table_info()(撰写本文时的v1.39),因为DBD文档可以告诉您db和驱动程序支持哪些功能(例如,SQLite没有目录)。这样的东西会给你你想要的东西:

use feature qw(say);
...

# Get info on every ('%') TABLE entity in the "main" schema.  Catalog is blank
# b/c DBD::SQLite and/or SQLite itself has no concept of catalogs.
my $sth = $dbh->table_info('', 'main', '%', 'TABLE');

while (my $r = $sth->fetchrow_hashref) {   # outputs:  table_a
  say $r->{TABLE_NAME};                    #           table_b
}
  

为什么每个索引都有一行?

不确定,但可能是tables()简单界面的意外。再次,使用table_info()枚举表和类似表的对象。

  

如何获取索引信息?

支持实验statistics_info()方法

  

以及如何获取.schema的等效信息?

你很幸运。 DBD :: SQLite驱动程序提供table_info扩展字段'sqlite_sql',对我来说,每个表后面都有“CREATE TABLE ...”语句。 (也是我从.schema得到的。)尝试:

my $sth = $dbh->table_info('', 'main', '%', 'TABLE');

while (my $r = $sth->fetchrow_hashref) {
  say $r->{sqlite_sql};
}

答案 1 :(得分:0)

如何列出表名:

my $sth=$dbh->table_info('','main','%', 'TABLE')
my $tables = [map{$_->[2]} @{$sth->fetchall_arrayref()}];
say join("\n", @$tables);