Perl DBI SQLite在不同的perl版本中有不同的表名

时间:2014-05-07 13:43:11

标签: perl sqlite dbi

我有一个问题,我现在无法独自解决。我有几台perl 5.10.0和5.10.1的机器和一个可以同时使用perl版本的任务。任务是合并2个或更多数据库文件,以便将所有表放在一个文件中。因此我使用了perl DBI模块。这是我的代码的一部分:

my $driver   = "SQLite";
my $database = "$dbb"; 
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh5 = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
                  or die $DBI::errstr;

#getting table name B:
my @tablesb = $dbh5->tables();

现在数组tablesb应该包含一个数据库文件的所有表(每个数据库文件中只有一个表)。我正在这一步获取表名。现在真正的问题是:

- 使用perl 5.10.1我得到3个表:“main.sqlite_master”,“temp.sqlite_temp_master”,“main.param_48”。 “param48”是表格的“真实”名称。

- 使用perl 5.10.0我得到:“sqlite_master”,“sqlite_temp_master”,“param_48”。

有谁知道,为什么我会得到不同的表名以及如何解决这个问题。或者甚至更好,我如何获得“真正的”表名?现在我使用此数组的第三个条目并将其拆分为点“。”

1 个答案:

答案 0 :(得分:1)

试试这个:

my $sth = $dbh->table_info('%', '%', '%');  # Any catalog, any schema, any object
my @tables;
while (my $r = $sth->fetchrow_hashref()) {
  push @tables, $r->{TABLE_NAME};
}

“真实”表名从SQLite的角度来看的限定表名(例如, main.tbl )。您只需要非限定对象名称,可以从table_info()获得。

<强>更新

我认为你看到不同行为的原因是你的两个perls正在加载不同版本的DBD :: SQLite(不是SQLite本身,而是perl驱动程序)。看起来DBD :: SQLite的table_info()实现在版本1.26的某个时候开始意识到sqlite的“主”和“临时”模式。由于tables()是根据table_info()实现的,因此较旧的驱动程序无法返回 schema.object 限定名称。