我正在为一个尚不存在的数据库创建一组SQL INSERT
语句,我将它们保存到文件中。
如何在不访问特定数据库的情况下使用Perl强大的DBI模块来创建这些INSERT语句。特别是,看起来使用$dbh->quote()
函数需要我通过与数据库的连接来实例化$dbh
。
答案 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的。