Perl class::dbi - 多个连接
Perl class::dbi - multiple connections
我有一个 class 库是我在过去几年开发的,它使用 Perl 的 Class::DBI 来包装关系数据库(Prestashop 的数据库方案,不重要)
有人知道在单个 perl 脚本中创建多个 "instances" 这个 class,指向不同的数据库吗?例如。现在我做类似的事情:
use MyClassLib;
MyClassLib->connection('dbi:mysql:mydatabase', 'username', 'password');
MyClassLib->some_method()
一切正常。
我想做的基本上是别名 MyClassLib
以便能够使用它的另一个 "instance" 指向不同的数据库。这很痛苦,因为 Class::DBI
将其数据库连接存储为静态。
类似这样的伪代码
use MyClassLib;
use MyClassLib as MyClassLibAlias;
MyClassLib->connection('dbi:mysql:mydatabase', 'username', 'password');
MyClassLibAlias->connection('dbi:mysql:mynewdatabase', 'username', 'password');
MyClassLib->some_method()
然后从代码访问MyClassLib
和MyClassLibAlias
。我知道 Class::DBI
是遗留问题,如果 Class::DBI
不存在,使用 DBIx::Class
的解决方案也将受到赞赏
谢谢
Class::DBI
docs 告诉您提供自己的 db_Main()
方法来代替使用 connection()
。我相信这可以 return 一个标准的 DBI 句柄,但是 Class::DBI 在内部使用 Ima::DBI。您可以为此使用单个 class,但要反映您的伪代码:
package MyClassLibAlias;
use base qw(MyClassLib);
sub db_Main {
my $self = shift;
my ($dsn, $username, $password) = ...;
return Ima::DBI->connect_cached($dsn, $username, $password);
}
您可能希望使用 class 属性引用 dsn、用户名和密码。
我有一个 class 库是我在过去几年开发的,它使用 Perl 的 Class::DBI 来包装关系数据库(Prestashop 的数据库方案,不重要)
有人知道在单个 perl 脚本中创建多个 "instances" 这个 class,指向不同的数据库吗?例如。现在我做类似的事情:
use MyClassLib;
MyClassLib->connection('dbi:mysql:mydatabase', 'username', 'password');
MyClassLib->some_method()
一切正常。
我想做的基本上是别名 MyClassLib
以便能够使用它的另一个 "instance" 指向不同的数据库。这很痛苦,因为 Class::DBI
将其数据库连接存储为静态。
类似这样的伪代码
use MyClassLib;
use MyClassLib as MyClassLibAlias;
MyClassLib->connection('dbi:mysql:mydatabase', 'username', 'password');
MyClassLibAlias->connection('dbi:mysql:mynewdatabase', 'username', 'password');
MyClassLib->some_method()
然后从代码访问MyClassLib
和MyClassLibAlias
。我知道 Class::DBI
是遗留问题,如果 Class::DBI
DBIx::Class
的解决方案也将受到赞赏
谢谢
Class::DBI
docs 告诉您提供自己的 db_Main()
方法来代替使用 connection()
。我相信这可以 return 一个标准的 DBI 句柄,但是 Class::DBI 在内部使用 Ima::DBI。您可以为此使用单个 class,但要反映您的伪代码:
package MyClassLibAlias;
use base qw(MyClassLib);
sub db_Main {
my $self = shift;
my ($dsn, $username, $password) = ...;
return Ima::DBI->connect_cached($dsn, $username, $password);
}
您可能希望使用 class 属性引用 dsn、用户名和密码。