【问题标题】:Perl DBI without accessing the databasePerl DBI 不访问数据库
【发布时间】:2011-07-12 19:43:47
【问题描述】:

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

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

【问题讨论】:

  • SQL 只是文本...创建查询字符串并保存它们。无需涉及 DBI。 DBI的quote()一般只是对数据库自己的quoting函数的一个透传,所以没有DB连接是无法做到的,否则DBI不知道调用哪个驱动的quote函数。

标签: mysql sql database perl dbi


【解决方案1】:

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

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

我仍然会建立DBI 连接,前提是您可以获得正确的引用格式。您实际上不需要向它发送任何语句,但您确实知道引用格式对于您将使用的数据库是正确的。

【讨论】:

    【解决方案2】:

    通常你会通过像这样指定一个数据库来使用 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");
    

    【讨论】:

      【解决方案3】:

      来自DBI::quote

      对于大多数数据库类型,至少是那些符合 SQL 标准的数据库类型,quote 将返回 'Don''t'(包括外引号)。对于其他人,它可能会返回类似 'Don\'t'

      也就是说,DBI::quote 的行为因数据库而异,以独立于数据库的方式调用它是没有意义的。

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

      【讨论】:

        【解决方案4】:

        您可以使用 DBD::CSV 或 DBD::AnyData 作为虚拟数据库。 SQLite 也适用于此目的。

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

        【讨论】:

          【解决方案5】:

          根据perl -MDBI -E 'say join(q{,},DBI->available_drivers);' 在只安装了 DBI(包“libdbi-perl”)的干净 Debian chroot 中,以下驱动程序立即可用:

          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() 就足够了。

          DBMFile 将 q{'} 转义为 q{\'} (" mysql" 样式);
          ExamplePSponge 转义:q{'} as q{'' }(“SQLite”样式)。

          【讨论】:

            【解决方案6】:

            你也可以使用:

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

            在不设置数据库句柄的情况下访问报价功能。我不相信它是特定于 MySQL 的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-04-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多