[英]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 " 样式);
ExampleP和Sponge转义: q{ ' } as q{ '' } (“ SQLite ”样式)。
您还可以使用:
DBD::_::db->quote()
在不设置数据库句柄的情况下访问报价 function。 我不相信它是特定于 MySQL 的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.