Почему метод отката не будет доступен для дескриптора DBI? - PullRequest
4 голосов
/ 14 октября 2008

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

do 'foo.pl'

до

use Foo;

и тогда я делаю

$dbh = Foo->connect;

А теперь почему-то я продолжаю получать сообщение об ошибке:

Невозможно найти метод объекта "rollback" через пакет "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;
}

Ответы [ 3 ]

7 голосов
/ 14 октября 2008

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

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

4 голосов
/ 14 октября 2008

С 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.

3 голосов
/ 14 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...