Sqlite 本地Perl DBI模块,Can';t定位对象方法“;“连接”;

Sqlite 本地Perl DBI模块,Can';t定位对象方法“;“连接”;,sqlite,perl,dbi,Sqlite,Perl,Dbi,我已经通过cpan安装了DBI模块。CPAN已配置为使用本地目录,因此我有~/perl5和~/.CPAN目录。该模块显然位于~/.cpan/build/DBI-1.642-0中,实际上它在那里有DBI.pm文件 但是,当我执行以下命令作为测试时,该命令表明没有“连接”对象: 环境:基于Debian的发行版,perl 5.26.2 关于可能重复的注意事项: 询问模块子类化,而不是我在做什么 附录:从评论中的讨论可以看出,许多用户只关注使用DBI语句。正如我在书中提到的: 整个目标是利用通过c

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

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

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

关于可能重复的注意事项:

  • 询问模块子类化,而不是我在做什么

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

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


请注意,在提问之前,我已经尝试了使用DBI和
使用lib qw()
方法。如我在回答中所述,如果没有安装
DBD::SQLite
模块,
use DBI
行本身是无效的。
perl-e
的问题已经解决,因为显然没有安装SQLite。我必须打开
cpan
shell并运行
installdbd::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\u 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()
中的库声明,我还在一些测试中清除了
@inc
数组。

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

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

DBI->connect("dbi:SQLite:dbname=foo.sqlite","","");
您得到的错误消息是:

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

这个错误很明显

(可能您忘记加载“DBI”?)

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

use DBI;
您的
使用libqw(.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解决了您的问题。这可能解决了您遇到的另一个问题,但并没有解决原始问题中的问题。

您必须
使用DBI
或将
-MDBI
添加到命令行中。该生成文件夹用于生成,而不是安装它的位置。您是否也安装了DBD::SQLite和操作系统的
libsqlite3 dev
软件包?如果您使用
cpan
安装它,则根本不需要
use lib
。试试
$perl-MDBI-e'DBI->connect(“DBI:SQLite:dbname=foo.SQLite”);'
@simbabque
使用DBI
@INC
目录列表调用系统范围的DBI模块,显然基于Debian的系统上缺少SQLite。在任何情况下,
use DBI
都会产生另一个错误:
install\u驱动程序(SQLite)失败:找不到DBD/SQLite.pm
perl-MDBI…
相同,提示DBI和SQLite彼此无关。它们是不同的模块。但是,如果您使用的是系统Perl,那么应该使用包管理器安装DBI和SQLite。谢谢你的建议。在我的个人笔记本电脑上,我当然可以安装两个debian软件包,但当我在不同的系统上使用ssh时,我将无法通过system package manager访问根级别的权限和安装软件包。因此,希望我尝试处理cpan的原因更有意义。在这种情况下,您会想看看Perl的local::lib模块,它允许您控制在何处安装什么。但要使SQLite正常工作,您仍然需要libsqlite3开发包。
/home/user/perl5/x86\u 64-linux-gnu-thread-multi/DBD
是一个错误的目录,您观察到的更改无法与此目录关联。可能(可能)
/home/user/perl5/x86\u 64-linux-gnu-thread-multi/
是正确的目录。原始问题中的问题不是由于缺少DBD::SQLite造成的。原始问题中的问题是由于您的代码中没有使用
DBI
。@DaveCross正如我在问题下的评论中提到的,我也尝试了
使用DBI
。假设
use DBI
调用系统范围的
DBI
模块,这可能是错误的。因此,问题实际上是DBD::SQLite。安装前-出现错误,安装后-正常工作。@Corion您可能是正确的,尽管我很确定我准确地复制了代码,甚至添加了
@inc=()
,以确保目录正常工作。稍后我将尝试验证这一点-目前必须离线。不过,谢谢你的评论。@SergiyKolodyazhnyy
use DBI;