如何将来自三个 Perl 数组的数据插入到单个 MySQL 表中?
Posted
技术标签:
【中文标题】如何将来自三个 Perl 数组的数据插入到单个 MySQL 表中?【英文标题】:How can I insert data from three Perl arrays into a single MySQL table? 【发布时间】:2012-09-13 18:44:24 【问题描述】:我在 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";
第三个也是类似的。 表的 a 列已正确填充,但表中的 b 列和 c 列没有数据。我做错了什么。
【问题讨论】:
您应该使用占位符,而不是尝试在查询中插入变量。这可能会导致您的问题。 【参考方案1】:我猜你对关系数据库不是很熟悉。你所做的是:
-
遍历
@a
为@a
中的每个项目准备一个新语句
每个插入添加一行,其中仅包含a
值;这意味着:
您为@a
的每个项目创建一个数据集
b
和 c
列是 NULL
。
现在你对@b
和@c
也这样做。这不是很有效。
DBI 旨在为您提供帮助。您应该考虑以下规则(指南):
始终使用 DBI 的quote
方法或更好的 placeholders。这样可以省去您自己添加引号的麻烦。
如果有一个循环和多个INSERT
s 或UPDATE
s,请始终将prepare
您的查询置于循环之外,而将execute
置于循环中。
那么我们来看看你的问题。我假设 @a
、@b
和 @c
都具有相同数量的项目,并且您希望 @a
、@b
和 @c
的每个索引都有一行。所以如果你有这些数据:
my @a = (1, 2, 3);
my @b = qw(foo bar baz)
my @c = (999, 998, 997);
我敢打赌,你希望它在 db 中看起来像这样:
a b c
1 foo 999
2 bar 998
3 baz 997
因此,我们需要将您的三个INSERT
s 合并为一个语句。这可以通过一次迭代所有这些来完成。我们可以使用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;
【讨论】:
感谢您详细且解释清楚的答案 simbabque。你猜对了,数组中的项目数量大致相同,而且我对关系数据库不是很熟悉。你的方法是绝对正确的,你拯救了我的一天!!非常感谢。真的很感激:) @Deepak:我很高兴这是对的。现在做了另一个编辑来澄清。 您还应该在文档中阅读有关 DBI 的更多信息。它非常强大,一旦你知道它,你就可以用它做很多事情。 再次感谢辛巴克。我一定会在文档中阅读有关 DBI 的信息。刚刚开始使用它,我非常兴奋。它确实非常强大并且提供了很多功能。也不知道 List::MoreUtils,也将阅读它:) @simbabque:很好的答案。我唯一的建议是avoid using$a
and $b
as lexicals以上是关于如何将来自三个 Perl 数组的数据插入到单个 MySQL 表中?的主要内容,如果未能解决你的问题,请参考以下文章
使用 laravel 4 上的循环将数据数组存储到单个数组中