Локальный модуль Perl DBI, не удается найти метод объекта "connect" - PullRequest
0 голосов
/ 22 января 2019

Я установил DBI модуль через cpan.CPAN был настроен на использование локального каталога, поэтому у меня есть каталоги ~/perl5 и ~/.cpan.Модуль, по-видимому, находится в ~/.cpan/build/DBI-1.642-0, который на самом деле содержит файл DBI.pm.

Однако, когда я выполняю следующую команду в качестве теста, команда предполагает, что объекта "connect" нет:

$ 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.Как я уже упоминал в комментариях :

Вся цель состоит в том, чтобы использовать модуль DBI, установленный через cpan.До установки DBD :: SQLite ни использование lib, ни использование DBI не давали работающего решения.Таким образом, предложение использовать DBI само по себе бесполезно.

Обратите внимание, что до того, как задать вопрос, я попробовал методы и use DBI, и use lib qw().Сама строка use DBI не работала без установки модуля DBD::SQLite, как указано в моем ответе.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Преобразованный из сценария командной строки в реальную программу, ваш код выглядит следующим образом:

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

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

И сообщение об ошибке вы получите:

Не удается найти метод объекта «connect» через пакет «DBI» (возможно, вы забыли загрузить «DBI»?) В строке -e 1.

Эта ошибка довольно очевидна.

(возможно, вы забыли загрузить «DBI»?)

Проблема здесь в том, что вам не хватает строки кода, которая фактически загружает модуль DBI. Вы должны добавить это:

use DBI;

Ваша строка use lib qw( .cpan/build/DBI-1.642-0/ ) очень странная. Вы просите Perl загрузить модуль из временного каталога сборки, который использовался во время установки. Это не та версия, которую вы хотите использовать вообще. Когда cpan завершит свою работу, у вас будет установлена ​​версия DBI в ваших стандартных каталогах библиотеки Perl, к которой вы сможете получить доступ без необходимости какого-либо use lib кода.

Я также добавлю, что если вы используете системную версию Perl, нет необходимости использовать cpan для установки наиболее популярных модулей. Вы можете использовать репозиторий готовых пакетов вашего дистрибутива. Например, apt get install libdbi-perl (в Debian и аналогичных) или dnf install perl-DBI (в Red Hat).

В своем ответе вы молча добавили пропущенный оператор use DBI и утверждаете, что установка DBD :: SQLite решила вашу проблему. Возможно, это решило другую проблему, которая у вас была, но это не решило проблему в вашем первоначальном вопросе.

0 голосов
/ 22 января 2019

Проблема с perl -e устранена, поскольку, очевидно, SQLite не был установлен. Мне пришлось открыть 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> 

Что касается самого модуля, он установлен в каталоге ~/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(), я также очистил массив @inc в некоторых моих тестах.

...