【问题标题】:Local Perl DBI module, Can't locate object method "connect"本地 Perl DBI 模块,找不到对象方法“连接”
【发布时间】:2019-06-15 19:34:07
【问题描述】:

我已经通过cpan 安装了DBI 模块。 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。

注意可能的重复:


附录:从 cmets 的讨论中可以看出,很多用户只关注use DBI 声明。正如我在the comments 中提到的:

整个目标是利用通过 cpan 安装的 DBI 模块。在安装 DBD::SQLite 之前,使用 lib 和使用 DBI 都没有给出可行的解决方案。所以单独使用 DBI 的建议没有用。

请注意,在提出问题之前,我已经尝试了 both use DBIuse lib qw() 方法。 use DBI 在我的回答中提到,如果不安装 DBD::SQLite 模块,它本身是无效的。

【问题讨论】:

  • 你必须use DBI 或添加-MDBI 到你的命令行。该构建文件夹用于构建,而不是安装位置。您是否还安装了 DBD::SQLite 和您的操作系统的 libsqlite3-dev 包?如果您使用cpan 安装它,则根本不需要use lib。试试$ perl -MDBI -e 'DBI->connect("dbi:SQLite:dbname=foo.sqlite");'
  • @simbabque use DBI@INC 目录列表调用系统范围的 DBI 模块,这显然在基于 Debian 的系统上缺少 SQLite。在任何情况下,use DBI 都会产生另一个错误:install_driver(SQLite) failed: Can't locate DBD/SQLite.pm perl -MDBI ... 建议也会发生同样的情况
  • DBI 和 SQLite 没有任何关系。它们是不同的模块。但是,如果您使用的是系统 Perl,则应该使用包管理器来安装 DBI 和 SQLite。 packages.debian.org/jessie/libdbi-perlpackages.debian.org/jessie/libdbd-sqlite3-perl.
  • @simbabque 谢谢你的建议。在我的个人笔记本电脑上,我当然可以安装两个 debian 包,但是当我要在不同系统上通过 ssh 工作时,我将无法访问 root 级别权限并通过系统包管理器安装包。所以希望我为什么要尝试处理 cpan 更有意义。
  • 在这种情况下,您可能需要查看 Perl 的 local::lib 模块,该模块允许您控制在何处安装什么。但是要让 SQLite 工作,你仍然需要 libsqlite3-dev 包。

标签: sqlite perl dbi


【解决方案1】:

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

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

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

你得到的错误信息是:

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

这个错误很明显。

(也许您忘记加载“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 解决了您的问题。这可能解决了您遇到的另一个问题,但并没有解决您原来问题中的问题。

【讨论】:

  • 虽然我同意最好使用发行版的存储库,但我不能在没有sudo 访问权限的系统上使用包管理器,因此使用cpan。另外,在我的回答中,我并没有默默地添加use DBI。我已经多次提到过:在安装DBD::SQLite 之前,该语句不起作用。安装后,代码按预期工作。我感谢您的回答,我同意多点。也许我的情况是一个极端情况,但我已经按原样记录了我在答案中的步骤。至于问题,如果您对哪里不清楚的地方有建议,请提出建议
【解决方案2】:

perl -e 的问题已经解决,因为显然没有安装 SQLite。我必须打开cpan shell 并运行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> 

模块本身已经安装在~/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBD/目录下。


基于Berserk's answer,以下也适用于显式调用:

$ 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() 的库声明,我还在一些测试中清除了@inc 数组。

【讨论】:

  • /home/user/perl5/x86_64-linux-gnu-thread-multi/DBD 是错误目录,您观察到的更改与该目录无关。也许 ( maybe ) /home/user/perl5/x86_64-linux-gnu-thread-multi/ 是一个正确的目录。
  • 原始问题中的问题不是由缺少 DBD::SQLite 引起的。原始问题中的问题是由于您的代码中没有 use DBI 引起的。
  • @DaveCross 正如我在问题下的 cmets 中提到的,我也尝试了 use DBI。假设是use DBI 调用了系统范围的DBI 模块,这可能是错误的。所以,问题实际上是DBD::SQLite。安装前 - 抛出错误,安装后 - 按预期工作。
  • @Corion 你可能是对的,虽然我很确定我完全复制了代码,甚至添加了@inc=() 以确保目录正常工作。我稍后会尝试验证 - 目前必须离线。不过,感谢您的评论。
  • @SergiyKolodyaznyy:正如评论所说,当您添加use DBI 时,错误发生了变化。因此,添加 use DBI 修复了您原来的错误并揭示了另一个不同的错误。
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多