2016-04-04 6 views
0

docs for connect_info:Как работает DBIx :: Class :: Storage :: DBI's connect_info?

connect_info

Этот метод обычно называется по "связи" в DBIx :: Class :: Schema, который инкапсулирует свой список аргументов в ссылку на массив перед передачей их здесь.

Список аргументов может содержать:

  • То же 4-элементный аргумент установлен один, как правило, переходят на «соединить» в DBI, необязательно с последующим дополнительными атрибутами, признаваемых DBIx :: Класс:

    $connect_info_args = [ $dsn, $user, $password, \%dbi_attributes?, \%extra_attributes? ]; 
    
  • единый справочный код, который возвращает , связанную базу данных DBI ручка может следовать дополнительные атрибуты признаваемых DBIx :: Класс:

    $connect_info_args = [ sub { DBI->connect (...) }, \%extra_attributes? ]; 
    
  • Один hashref со всеми атрибутами и DSn/пользователь/пароль смешанные вместе:

    $connect_info_args = [{ 
        dsn => $dsn, 
        user => $user, 
        password => $pass, 
        %dbi_attributes, 
        %extra_attributes, 
    }]; 
    
    $connect_info_args = [{ 
        dbh_maker => sub { DBI->connect (...) }, 
        %dbi_attributes, 
        %extra_attributes, 
    }]; 
    

    Это особенно полезно для приложений на основе Catalyst, что позволяет следующий конфигурационный (Config :: Общий стиль):

    <Model::DB> 
        schema_class App::DB 
        <connect_info> 
         dsn   dbi:mysql:database=test 
         user   testuser 
         password  TestPass 
         AutoCommit 1 
        </connect_info> 
    </Model::DB> 
    

    dsn/user/password комбинация может быть заменена dbh_maker ключа , значение которого является coderef, которая возвращает подключенную базу данных DBI обрабатывать

Пожалуйста, обратите внимание, что документы DBI рекомендуется всегда явно установить AutoCommit к либо 0 или 1. DBIx :: Class далее рекомендует установить значение в 1 и выполнить транзакции через наш «txn_do» в DBIx :: Class :: Schema. DBIx :: Class задает значение 1, если вы не , явно установите его на ноль. Это значение по умолчанию для большинства DBD. Подробнее см. В разделе «DBIx :: Class и AutoCommit».

Что это? Это метод, называемый внутренним или глобальным? И если это метод, называемый внутри, почему он отправляется либо создателем dbh, либо четырьмя аргументами? Что определяет, что он отправляет? Он указан как метод. Что такое $connect_info_args?

+2

Если вы собираетесь распечатать весь раздел документации, можете ли вы, по крайней мере, отформатировать его так, чтобы его можно было прочитать? Просто ссылка была бы лучше, чем неразборчивый беспорядок. – ThisSuitIsBlackNot

+0

Это актуально, если вы наследуете класс схемы и хотите повлиять на то, как создается соединение. Это может быть для отладки целей или для ввода тестовой базы данных или чего-то подобного. Это также интересно, потому что он возвращает информацию о соединении, которая снова полезна для тестирования, отладки, профилирования и, вероятно, также в странных случаях производства. Я не стану публиковать это как ответ, потому что я слишком устал, чтобы подробно разбираться. Если вы просто используете DBIC, вам не нужно иметь дело с этим. – simbabque

+0

Несомненно, это метод аргументации? Является ли $ connect_info_args тем, что я получаю, или тем, что я возвращаю? Что получает метод? есть ли две подписи? –

ответ

0

Вот как я получил его на работу

схемы класса

Вы должны использовать хранилище, которое будет сделано, как это (и вы можете найти его в документации)

package MyDBIC::Schema; 
__PACKAGE__->storage_type("DBIx::Class::Storage::DBI::mysql::MySubClass") 

Storage Class

package DBIx::Class::Storage::DBI::mysql::MySubClass; 
use mro 'c3'; 
use base 'DBIx::Class::Storage::DBI::mysql'; 
sub connect_info { 
    my $self = shift; 
    my $retval = $self->next::method([{ 
     username => _username(), 
     password => $password, 
     dsn => "my:dsn:" 
    }) 
    $retval; 
}; 

Я нашел грубый пример того, как сделать это burred here. Разговор о дерьмовых документах.

connect_info, похоже, сломан. Дела шли.

  • Подклассификация хранения с помощью таможни connect_info. Он получает вызов, но ничего не возвращает ничего полезного. Вызов ->connect->storage->ensure_connected; по схеме приводит к ошибке.
  • Обертывание connect_info с лося :: вокруг(). Не удается обернуть. The method 'connect_info' was not found in the inheritance hierarchy.
  • Вызывается $self->connect_info() от BUILD ... DBIx::Class::Storage::DBI::connect_info, но независимо от того, что я ему передаю, sub получает только $ self, первый аргумент.
  • Вызов __PACKAGE__->connect_info({}) или __PACKAGE__->connect_info([{}]) результатов в обеих аргументах, посылаемый на DBIx::Class::Storage::DBI::connect_info, но отсутствие $self приводит Class::XSAccessor: invalid instance method invocant: no hash ref supplied at когда к югу пытается записать в аксессору.
+0

Вторая ошибка говорит «contact_info», тогда как она должна быть «connect_info». –

 Смежные вопросы

  • Нет связанных вопросов^_^