我有一个问题,我现在无法独自解决。我有几台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”。
有谁知道,为什么我会得到不同的表名以及如何解决这个问题。或者甚至更好,我如何获得“真正的”表名?现在我使用此数组的第三个条目并将其拆分为点“。”
答案 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 限定名称。