2011-07-12 110 views
5

我正在爲尚不存在的數據庫創建一組SQL INSERT語句,並將它們保存到文件中。沒有訪問數據庫的Perl DBI

如何在不訪問特定數據庫的情況下使用Perl強大的DBI模塊創建這些INSERT語句。特別是,它看起來像使用$dbh->quote()函數要求我實例化$dbh連接到數據庫。

+1

SQL只是文本...創建查詢字符串並保存它們。無需涉及DBI。 DBI的quote()通常只是數據庫自己的引用函數的傳遞,所以不能在沒有數據庫連接的情況下完成,否則DBI將不知道要調用哪個驅動器的引用函數。 –

回答

4

不幸的是,實際的quote()行爲並不總是一個便攜式的特點,所以每個驅動程序會做不同的。除非您連接到驅動程序,否則您不知道在實際中使用哪種引用格式。 (有一個模塊可能不需要連接,DBIx::Abstract,但它並不是最新的。)。

quote()方法實際上是由相應的驅動程序類在DBD::*命名空間中實現的。您可能會嘗試加載您需要的驅動程序並直接調用該函數(請參閱http://search.cpan.org/~timb/DBI-1.616/lib/DBI/DBD.pm#Writing_DBD::Driver::db::quote),但這種感覺很骯髒。

如果只有這樣才能得到正確的引用格式,我仍然可以創建DBI連接。您不需要實際發送任何語句,但是您確實知道引用格式對於您要使用的數據庫而言是正確的。

3

DBI::quote

對於大多數數據庫類型,至少是那些符合SQL標準,報價將返回「特別申明,不要」(包括外引號)。對於其他人可能會返回類似「不要\」 T」

也就是說,DBI::quote行爲其他數據庫不同,它沒有任何意義,以調用它獨立於數據庫的方式。

與您正在編寫的相同類型的數據庫進行微不足道的連接,或者瞭解數據庫的引用約定,並自己實現一個quote方法。有關參考實現,請參見DBI source

1

您可以使用DBD :: CSV或DBD :: AnyData作爲虛擬數據庫。 SQLite也適用於這個目的。

這裏使用SQLite的一個隱藏優勢是它是一個半真實的數據庫,並且會傾向於使您以與任何特定數據庫分離的方式編寫代碼。

-1

您還可以使用:

DBD::_::db->quote() 

要訪問的報價功能,無需建立一個數據庫句柄。儘管我不相信它是特定於MySQL的。

4

通常你會使用DBI通過指定像這樣一個數據庫:

my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=127.0.0.1"); 

但是,你的數據庫尚不存在,所以你不能連接到它。你可以使用DBI 沒有指定數據庫,像這樣:

my $dbh = DBI->connect("DBI:mysql:;host=127.0.0.1"); 
0

根據perl -MDBI -E 'say join(q{,},DBI->available_drivers);' 清潔Debian chroot環境中,只有DBI(包「libdbi-perl的」)安裝下列驅動程序可用的時候了:

DBM,ExampleP,File,Gofer,Proxy,Sponge 

爲我的作品的最小DBI連接語句是

my $dbh=DBI->connect("DBI:DRIVER:"); # DRIVER is one of [DBM,File,ExampleP,Sponge,mysql,SQLite] 

這足以使用$dbh->quote()而沒有任何數據庫。

DBM文件逃逸q {'}爲q {\'}( 「MySQL的」 風格);
ExampleP海綿逃逸:Q {}爲q {''}( 」的SQLite「 樣式)。