Perl DBI无需访问数据库

时间:2011-07-12 19:43:47

标签: mysql sql database perl dbi

我正在为一个尚不存在的数据库创建一组SQL INSERT语句,我将它们保存到文件中。

如何在不访问特定数据库的情况下使用Perl强大的DBI模块来创建这些INSERT语句。特别是,看起来使用$dbh->quote()函数需要我通过与数据库的连接来实例化$dbh

6 个答案:

答案 0 :(得分:4)

不幸的是,实际的quote()行为并不总是一个可移植的特性,因此每个驱动程序都会以不同的方式执行它们。除非您连接到驱动程序,否则您不知道在实践中使用哪种引用格式。 (有一个模块可能在没有连接的情况下执行此操作DBIx::Abstract,但它不是特别新的。)。

quote()方法实际上是由DBD::*命名空间中相应的驱动程序类实现的。您可能尝试加载您需要的驱动程序并直接调用该函数(请参阅http://search.cpan.org/~timb/DBI-1.616/lib/DBI/DBD.pm#Writing_DBD::Driver::db::quote)但这感觉很肮脏。

我仍然会建立DBI连接,只是为了让您获得正确的引用格式。您不需要实际发送任何语句,但是您确实知道引用格式对于您将使用的数据库是正确的。

答案 1 :(得分: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");

答案 2 :(得分:3)

来自DBI::quote

  

对于大多数数据库类型,至少那些符合SQL标准的数据类型,引用将返回'不'(包括外部引号)。对于其他人,它可能会返回类似“不要”的东西

也就是说,DBI::quote的行为因数据库而异,并且以与数据库无关的方式调用它是没有意义的。

与您正在编写的相同类型的数据库建立一个简单的连接,或者学习数据库的引用约定并自己实现quote方法。有关参考实现,请参阅DBI source

答案 3 :(得分:1)

您可以将DBD :: CSV或DBD :: AnyData用作虚拟数据库。 SQLite也很适合这个目的。

在这里使用SQLite的一个隐藏优势是它是一个半实数的数据库,并且会使你以一种与任何特定数据库分离的方式编写代码。

答案 4 :(得分: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 Sponge 转义:q {'}为q {''}(“ SQLite < / em>“风格”。

答案 5 :(得分:-1)

您也可以使用:

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

在不设置数据库句柄的情况下访问引用函数。我不相信它是特定于MySQL的。