DBIx :: Class :: Storage :: DBI的connect_info是如何工作的?

时间:2016-04-04 21:49:39

标签: perl dbix-class

docs for connect_info

  

connect_info

     

这个方法通常由DBIx :: Class :: Schema中的“connection”调用,   它在传递之前将其参数列表封装在arrayref中   他们在这里。

     

参数列表可能包含:

     
      
  • 相同的4元素参数集通常会传递给“连接”   在DBI中,可选地后跟可识别的额外属性   DBIx ::类别:

    $connect_info_args = [ $dsn, $user, $password, \%dbi_attributes?, \%extra_attributes? ];
    
  •   
  • 返回a的单个代码引用   连接的DBI数据库句柄可选地后跟额外的属性   由DBIx :: Class识别:

    $connect_info_args = [ sub { DBI->connect (...) }, \%extra_attributes? ];
    
  •   
  • 包含所有属性和dsn / user / password的单个hashref   混合在一起:

    $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 :: General style):

    <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键替换   其值为返回连接的DBI数据库句柄的coderef

  •   
     

请注意,DBI文档建议您始终明确设置   AutoCommit为0或1. DBIx :: Class进一步推荐它   设置为1,并通过我们的“txn_do”执行交易   DBIx :: Class :: Schema方法。如果不这样做,DBIx :: Class会将其设置为1   明确地将其设置为零。这是大多数DBD的默认设置。看到   “DBIx :: Class和AutoCommit”了解详情。

这是什么?它是一种内部称为全局的方法吗?并且,如果它是一个内部调用的方法,为什么它被发送到dbh制造商或四个参数?是什么决定了它的发送方式?它被列为一种方法。什么是$connect_info_args

1 个答案:

答案 0 :(得分:0)

以下是我如何使用它

架构类

你必须使用这样做的存储(你可以在文档中找到它)

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

存储类

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;会导致错误。
  • 用Moose :: around()包装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会导致{{1}当子尝试写入访问者时。