本地Perl DBI模块,找不到对象方法“连接”

时间:2019-01-22 10:41:31

标签: sqlite perl dbi

我已经通过DBI安装了cpan模块。 CPAN已配置为使用本地目录,因此我有~/perl5~/.cpan目录。该模块显然位于~/.cpan/build/DBI-1.642-0中,实际上那里确实有DBI.pm文件。

但是,当我执行以下命令作为测试时,该命令表明没有“连接”对象:

$ perl -e 'use lib qw( .cpan/build/DBI-1.642-0/ ); DBI->connect("dbi:SQLite:dbname=foo.sqlite","","");'
Can't locate object method "connect" via package "DBI" (perhaps you forgot to load "DBI"?) at -e line 1.

环境:基于Debian的发行版,perl 5.26.2。

注意可能的重复项:


附录:从评论中的讨论中可以明显看出,许多用户只关注use DBI语句。正如我在the comments中提到的:

  

整个目标是利用通过cpan安装的DBI模块。在安装DBD :: SQLite之前,既不使用lib也不使用DBI提供有效的解决方案。因此,仅使用DBI的建议是没有用的。

请注意,在提出问题之前,我已经尝试过两者 use DBIuse lib qw()方法。如我的回答中所述,use DBI行本身如果不安装DBD::SQLite模块就无效。

2 个答案:

答案 0 :(得分:4)

从命令行脚本转换为实际程序后,您的代码如下:

use lib qw( .cpan/build/DBI-1.642-0/ );

DBI->connect("dbi:SQLite:dbname=foo.sqlite","","");

您收到的错误消息是:

  

无法通过-e第1行通过包“ DBI”(也许您忘记加载“ DBI”?)找到对象方法“ connect”。

这个错误很明显。

  

(也许您忘记加载“ DBI”了吗?)

这里的问题是您缺少实际加载DBI模块的代码行。您需要添加以下内容:

use DBI;

您的use lib qw( .cpan/build/DBI-1.642-0/ )行很奇怪。您要让Perl从安装期间使用的临时构建目录中加载模块。那根本不是您要使用的版本。 cpan完成工作后,将在标准Perl库目录中安装一个版本的DBI,无需任何use lib代码即可访问该版本。

我还要补充一点,如果您使用的是系统安装的Perl版本,则无需使用cpan来安装最受欢迎的模块。您可以使用发行版的预建软件包存储库。例如apt get install libdbi-perl(在Debian和类似版本上)或dnf install perl-DBI(在Red Hat上)。

在回答中,您已静默添加了丢失的use DBI语句,并声称安装DBD :: SQLite解决了您的问题。那可能已经解决了您遇到的另一个问题,但是并没有解决您原来的问题。

答案 1 :(得分:0)

<button class="btn btn-block btn-round btn-d" id="cfsubmit" name ="cfsubmit" type="button">Submit</button> $("#cfsubmit").on('click', function (e) { const $thisBtn = $(this), $form = $('#contactForm'), $cfResponse = $('#contactFormResponse'), formData = $form.serialize(); $thisBtn.text("Sending..."); $.ajax({ url: 'php/contact.php', type: "POST", data: formData, success: function (data) { $cfResponse.html(data); $thisBtn.text('Send'); $form.find(':input').val(''); }, error: function ( data ) { alert("Error occurd! Please try again"); } }); return false; }); 有关的问题已解决,因为显然未安装SQLite。我必须打开perl -e shell,然后运行cpan。现在,命令行可以正常工作:

install DBD::SQLite

关于模块本身,它已安装在$ $ perl -e 'use DBI; my $db = DBI->connect( "dbi:SQLite:dbname=foo.sqlite","","" );my $stmt = qq(CREATE TABLE foo(a int, b text); ); $db->do($stmt)' $ sqlite3 foo.sqlite SQLite version 3.23.1 2018-04-10 17:39:29 Enter ".help" for usage hints. sqlite> .tables foo sqlite> .schema foo CREATE TABLE foo(a int, b text); sqlite> 目录中。


基于Berserk's answer,以下内容也可用于显式调用:

~/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBD/

为确保此方法显式使用$ perl -e 'use lib qw( /home/user/perl5/x86_64-linux-gnu-thread-multi/DBD ); use DBI; my $db = DBI->connect( "dbi:SQLite:dbname=foo.sqlite","","" );my $stmt = qq(CREATE TABLE foo(a int, b text); ); $db->do($stmt)' 中的库声明,我还在某些测试中清除了use lib qw()数组。