我正在尝试从 1 个 Perl 脚本连接到同一个 MySQL 实例上的 2 个数据库。
我在迁移脚本中使用它,我从原始数据库中获取数据并将其插入到新数据库中。
连接到 1 个数据库,然后尝试与同一用户启动第二个连接,只会将当前数据库更改为新数据库。
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "mysql";
my $database1 = "db1";
my $dsn1 = "DBI:$driver:database=$database1";
my $userid = "userhead";
my $password = "pwdhead";
my $database2 = "db2";
my $dsn2 = "DBI:$driver:database=$database2";
my $dbh1 = DBI->connect($dsn1, $userid, $password ) or die $DBI::errstr;
my $dbh2 = DBI->connect($dsn2, $userid, $password ) or die $DBI::errstr;
my $sth = $dbh2->prepare("INSERT INTO Persons") $dbh1->prepare("SELECT *FROM Persons");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows;
在上面的例子中,我试图从一个数据库表复制到另一个数据库表。但是我在运行脚本时遇到错误。请帮帮我
最佳答案
据推测,您正在尝试使用相同的数据库句柄连接到两个数据库。如果您需要操作两个单独的连接,那么您需要两个单独的句柄
此程序使用 data_sources
类方法来发现所有可用的 MySQL 数据库并创建到每个数据库的连接,将句柄放入数组 @dbh
中。例如,您可以照常使用该数组的每个元素
my $stmt = $dbh[0]->prepare('SELECT * FROM table)
您可能更喜欢手动设置 @databases
数组,或者两个数据源的用户名和密码可能不同,因此可能需要对此进行一些更改
use strict;
use warnings 'all';
use DBI;
my $user = 'username';
my $pass = 'password';
my @databases = DBI->data_sources('mysql');
my @dbh = map { DBI->connect($_, $user, $pass) } @databases;
更新
您需要从源表中选择数据,一次获取一行,然后将每一行插入到目标表中
这是一个如何工作的想法,但您需要调整 INSERT
语句的 VALUES
中问号的数量以匹配列数
请注意,如果您只是打算复制整个数据集,则有更好的方法来完成此操作。特别是,如果您有任何外键约束,那么在它所依赖的表被填充之前您将无法添加数据
#!/usr/bin/perl
use strict;
use warnings 'all';
use DBI;
my $userid = "userhead";
my $password = "pwdhead";
my ($dbase1, $dbase2) = qw/ db1 db2 /;
my $dsn1 = "DBI:mysql:database=$dbase1";
my $dsn2 = "DBI:mysql:database=$dbase2";
my $dbh1 = DBI->connect($dsn1, $userid, $password ) or die $DBI::errstr;
my $dbh2 = DBI->connect($dsn2, $userid, $password ) or die $DBI::errstr;
my $select = $dbh1->prepare("SELECT * FROM Persons");
my $insert = $dbh2->prepare("INSERT INTO Persons VALUES (?, ?, ?, ?, ?)");
$select->execute;
while ( my @row = $select->fetchrow_array ) {
$insert->execute(@row);
}
如果您需要单独处理来自源数据的列,那么您可以使用命名标量而不是数组 @row
。像这样
while ( my ($id, $name) = $select->fetchrow_array ) {
my $lastname = '';
$insert->execute($id, $name, $lastname);
}
关于mysql - perl脚本同时连接两个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080491/