Почему метод отката недоступен для дескриптора DBI?

По какой-то причине у меня проблемы с дескриптором DBI. В основном произошло то, что я сделал специальную функцию подключения в модуле perl и переключился с выполнения:

do 'foo.pl'

to

use Foo;

а потом я делаю

$dbh = Foo->connect;

И вот почему-то все время выдает ошибку:

Не удалось найти метод объекта "откат" через пакет "Foo" в строке 171 ../Foo.pm.

Странно то, что $ dbh определенно не является Foo, он просто определен в foo. Во всяком случае, до сих пор у меня не было с этим проблем. Есть идеи, что случилось?

Изменить: @Axeman: connect не существовало в оригинале. Раньше у нас была только строка, которую мы использовали вот так:

do 'foo.pl';
$dbh = DBI->connect($DBConnectString);

так что connect это что-то вроде этого

sub connect {
    my $dbh = DBI->connect('blah');
    return $dbh;
}

person Frew Schmidt    schedule 13.10.2008    source источник
comment
Вы изменили соединительный вызов?   -  person Axeman    schedule 14.10.2008


Ответы (3)


Из perlfunc:

        do 'stat.pl';

    is just like

        eval `cat stat.pl`;

Итак, когда вы do 'foo.pl', вы выполняете код в текущем контексте. Поскольку я не знаю, что происходит в foo.pl или Foo.pm, я не могу сказать вам, что изменилось. Но я могу вам сказать, что он всегда выполняется в текущем контексте, а теперь выполняется в пространстве имен Foo::.

Как вы это вызываете, вы передаете 'Foo' в качестве первого параметра в Foo::connect или возвращаемую подпрограмму из Foo->can('connect'). Кажется, что это каким-то образом передается в какой-то код, который думает, что это дескриптор базы данных, и сообщает этот объект rollback.

person Community    schedule 14.10.2008
comment
Да, это была ошибка. Мне нужен статический метод, и я притворялся, что Foo - это класс, но это не так, это пакет. Спасибо! - person Frew Schmidt; 14.10.2008

Нам нужно увидеть реальный код в Foo, чтобы ответить на этот вопрос. Вероятно, вы захотите прочитать Создание подкласса DBI из документации, чтобы узнать, как сделать это правильно.

По сути, вам либо нужно, чтобы Foo был подклассом DBI должным образом (опять же, вам нужно прочитать документацию), либо вам нужно объявить функцию подключения для правильного делегирования методу DBI :: connect. Однако будьте осторожны при написании производственной оболочки для объектно-ориентированного кода. Так поддерживать состояние становится ужасно сложно.

person Ovid    schedule 14.10.2008

Я согласен с Axeman. Вероятно, вы должны вызывать свою функцию, используя

use Foo;
...
$dbh = Foo::connect();

вместо Foo-> connect ();

person Frentos    schedule 14.10.2008