我正在爲尚不存在的數據庫創建一組SQL INSERT
語句,並將它們保存到文件中。沒有訪問數據庫的Perl DBI
如何在不訪問特定數據庫的情況下使用Perl強大的DBI模塊創建這些INSERT語句。特別是,它看起來像使用$dbh->quote()
函數要求我實例化$dbh
連接到數據庫。
我正在爲尚不存在的數據庫創建一組SQL INSERT
語句,並將它們保存到文件中。沒有訪問數據庫的Perl DBI
如何在不訪問特定數據庫的情況下使用Perl強大的DBI模塊創建這些INSERT語句。特別是,它看起來像使用$dbh->quote()
函數要求我實例化$dbh
連接到數據庫。
不幸的是,實際的quote()
行爲並不總是一個便攜式的特點,所以每個驅動程序會做不同的。除非您連接到驅動程序,否則您不知道在實際中使用哪種引用格式。 (有一個模塊可能不需要連接,DBIx::Abstract
,但它並不是最新的。)。
quote()
方法實際上是由相應的驅動程序類在DBD::*
命名空間中實現的。您可能會嘗試加載您需要的驅動程序並直接調用該函數(請參閱http://search.cpan.org/~timb/DBI-1.616/lib/DBI/DBD.pm#Writing_DBD::Driver::db::quote),但這種感覺很骯髒。
如果只有這樣才能得到正確的引用格式,我仍然可以創建DBI
連接。您不需要實際發送任何語句,但是您確實知道引用格式對於您要使用的數據庫而言是正確的。
對於大多數數據庫類型,至少是那些符合SQL標準,報價將返回「特別申明,不要」(包括外引號)。對於其他人可能會返回類似「不要\」 T」
也就是說,DBI::quote
行爲其他數據庫不同,它沒有任何意義,以調用它獨立於數據庫的方式。
與您正在編寫的相同類型的數據庫進行微不足道的連接,或者瞭解數據庫的引用約定,並自己實現一個quote
方法。有關參考實現,請參見DBI source。
您可以使用DBD :: CSV或DBD :: AnyData作爲虛擬數據庫。 SQLite也適用於這個目的。
這裏使用SQLite的一個隱藏優勢是它是一個半真實的數據庫,並且會傾向於使您以與任何特定數據庫分離的方式編寫代碼。
您還可以使用:
DBD::_::db->quote()
要訪問的報價功能,無需建立一個數據庫句柄。儘管我不相信它是特定於MySQL的。
通常你會使用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");
根據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「 樣式)。
SQL只是文本...創建查詢字符串並保存它們。無需涉及DBI。 DBI的quote()通常只是數據庫自己的引用函數的傳遞,所以不能在沒有數據庫連接的情況下完成,否則DBI將不知道要調用哪個驅動器的引用函數。 –