2013-07-15 41 views
3

我想以.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,在此PARAMS解釋後,我還沒有完全理解如何填充它們獲得的表的信息,以獲得表名只有一次,或者如果它可以擁有所有,與.schema相同的信息。

任何例子或更詳細的用法鏈接將不勝感激。

[更新]]
只是以供將來參考這些都是阻止我由我自己去尋找答案,詢問這裏前兩個問題:

1 - 谷歌直接我一個非常古老的DBD-SQLite的文檔在它幾乎沒有,我沒有在頁面頂部的注意鏈接到最新版本的頁面。

2-之前問我在這裏大約table_info(正確答案),但作爲幾年其他線程讀取,而無需編寫代碼DBI我落在新人的一個陷阱。作爲$ dbh->表返回一個數組,我沒注意那個table_info返回語句處理程序,試圖在調試器x $dbh->table_info(...)並獲得一個空的哈希我卡住了,所以當。我忘記了需要調用返回的$ sth的獲取部分。

回答

3

如何獲得只將表(沒有做的uniq)

$dbh->tables界面過於簡單,我猜,代表SQL引擎和各種驅動程序的複雜性。當你發現,你應該使用table_info()代替。因爲DBD文檔可以告訴你數據庫和驅動程序支持哪些功能(例如,SQLite沒有目錄)。請參閱DBD::SQLite documentation for table_info()(在編寫本文時爲v1.39)。像這樣的東西會給你想要的東西:

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}; 
} 
+0

達姆就谷歌! ;-)。我從谷歌去DBD-sqlite,並且在http://search.cpan.org/~msergeant/DBD-SQLite-0.31/lib/DBD/SQLite.pm結束,那裏的信息幾乎沒有。我會問你從哪裏獲得信息,並掃描頁面的所有角落,我意識到在我的dbd-sqlite頁面的頂部行是'最新版本1.39'。現在我處於正確的文檔頁面。感謝您的示例,並幫助我認識到我處於錯誤的文檔頁面。 –

0

如何列出表名:

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