簡體   English   中英

Perl DBI 不訪問數據庫

[英]Perl DBI without accessing the database

我正在為尚不存在的數據庫創建一組 SQL INSERT語句,並將它們保存到文件中。

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

通常你會通過像這樣指定一個數據庫來使用 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");

不幸的是,實際的quote()行為並不總是可移植的特性,因此每個驅動程序都會以不同的方式執行它們。 除非您連接到驅動程序,否則您不知道在實踐中使用哪種引用格式。 (有一個模塊可以在沒有連接的情況下執行此操作, DBIx::Abstract ,但它不是特別最新。)。

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

我仍然會建立DBI連接,如果只是為了讓您獲得正確的報價格式。 您實際上不需要向它發送任何語句,但是您確實知道引用格式對於您將使用的數據庫是正確的。

來自DBI::quote

對於大多數數據庫類型,至少那些符合 SQL 標准的數據庫類型,quote 將返回 'Don''t'(包括外引號)。 對於其他人,它可能會返回類似 'Don\'t'

也就是說, DBI::quote的行為因數據庫而異,以獨立於數據庫的方式調用它是沒有意義的。

與您正在編寫的同一類型的數據庫建立簡單的連接,或者學習數據庫的引用約定並自己實現quote方法。 請參閱DBI 源代碼以獲取參考實現。

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

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

根據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{ ' } as q{ \' } (" mysql " 樣式);
ExamplePSponge轉義: q{ ' } as q{ '' } (“ SQLite ”樣式)。

您還可以使用:

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

在不設置數據庫句柄的情況下訪問報價 function。 我不相信它是特定於 MySQL 的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM