繁体   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