Dee*_*pak 2 mysql arrays perl insert
我在Perl中有3个不同的数组(即A,B和C).现在,我在mysql中有一个表,它还有3个字段.
我要做的是在mysql表的第一个字段中获取数组A的所有内容,在第二个字段中获取数组B的内容,依此类推.我尝试使用foreach循环执行此操作,但它适用于第一个数组,但不会为第二个和第三个数组插入任何内容.
代码使用如下:
foreach my $a (@a) {
my $sql = "insert into es(a) VALUES(\"$a\")";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
}
foreach my $b (@b) {
my $sql = "insert into es(b) VALUES(\"$b\")";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
}
Run Code Online (Sandbox Code Playgroud)
并且类似地为第三.表的列a正确填充,但表中没有列b和c的数据.我究竟做错了什么.
我猜你对关系数据库不太熟悉.你做的是:
@a@aa值; 这意味着:
@ab和c是NULL.现在你做的@b和@c同样.这不是很有效.
DBI旨在帮助您.您应该考虑以下规则(指南):
quote方法或更好的占位符.这样可以省去addind引用的麻烦.INSERTs或UPDATEs,那么总是prepare在循环之外进行查询而只是execute循环中的查询.我们来看看你的问题吧.我假设@a,@b并且@c所有项目的数量都相同,并且您希望每个索引有一行@a,@b和@c.所以如果你有这些数据:
my @a = (1, 2, 3);
my @b = qw(foo bar baz)
my @c = (999, 998, 997);
Run Code Online (Sandbox Code Playgroud)
我敢打赌,你希望它在db中看起来像这样:
a b c
1 foo 999
2 bar 998
3 baz 997
Run Code Online (Sandbox Code Playgroud)
因此,我们需要将您的三个结合INSERT成一个陈述.这可以通过一次迭代所有这些来完成.我们可以使用List :: MoreUtils中的each_array函数来处理迭代.我们还将上面的指南添加到代码中.
use List::MoreUtils qw(each_array);
my $dbh = DBI->connect(); # connect to db here
# prepare the INSERT statement once
my $sth_insert = $dbh->prepare('INSERT INTO es SET a=?, b=?, c=?')
or die $dbh->errstr;
# create the array iterator
my $ea = each_array(@a, @b, @c);
# iterate over all three arrays step by step
while ( my ($val_a, $val_b, $val_c) = $ea->() ) {
$sth_insert->execute($val_a, $val_b, $val_c) or die $dbh->errstr;
}
Run Code Online (Sandbox Code Playgroud)