如何将来自三个 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 的每个项目创建一个数据集 bc 列是 NULL

现在你对@b@c 也这样做。这不是很有效。

DBI 旨在为您提供帮助。您应该考虑以下规则(指南):

始终使用 DBI 的 quote 方法或更好的 placeholders。这样可以省去您自己添加引号的麻烦。 如果有一个循环和多个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);

我敢打赌,你希望它在 db 中看起来像这样:

a b   c
1 foo 999
2 bar 998
3 baz 997

因此,我们需要将您的三个INSERTs 合并为一个语句。这可以通过一次迭代所有这些来完成。我们可以使用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 表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将正则表达式捕获存储在 Perl 的数组中?

Excel VBA将数组变量插入到访问中的单个字段中

使用 laravel 4 上的循环将数据数组存储到单个数组中

如何遍历数组以插入数据库

在 Perl 中,如何在文件中更改、删除或插入一行,或追加到文件的开头?

如何在 MVC 的单个视图中制作插入表单和显示来自数据库的数据的表?