如何使用Perl的DBI模块将并行数组中的值插入数据库?

时间:2009-11-18 19:54:42

标签: perl dbi

我需要使用Perl的DBI模块在​​数据库中插入值。我已经解析了一个文件来获取这些值,因此这些值存在于数组中,比如@array1@array2@array3。我知道如何一次插入一个值,但不是从数组中插入。

我知道一次插入一个值:

$dbh = DBI->connect("dbi:Sybase:server=$Srv;database=$Db", "$user", "$passwd") or die "could not connect to database";
$query= "INSERT INTO table1 (id, name, address) VALUES (DEFAULT, tom, Park_Road)"; 
$sth = $dbh->prepare($query) or die "could not prepare statement\n";
$sth-> execute or die "could not execute statement\n $command\n";

我不确定我是否有包含id的array1,包含名称的array2和包含地址的array3,我将如何插入值。

4 个答案:

答案 0 :(得分:4)

由于你有并行数组,你可以采用execute_array

的优势
my $sth = $dbh->prepare('INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)');
my $num_tuples_executed = $sth->execute_array(
    { ArrayTupleStatus => \my @tuple_status },
    \@ids,
    \@names,
    \@addresses,
);

请注意,这是文档中的截断(略微修改)示例。如果您决定使用此功能,您肯定想要查看其余部分。

答案 1 :(得分:2)

使用placeholders

更新:我刚刚意识到你有并行数组。这实际上不是处理数据项的好方法。有了这个警告,您可以使用List::MoreUtils::each_array

#!/usr/bin/perl

use strict; use warnings;

use DBI;
use List::MoreUtils qw( each_array );

my $dbh = DBI->connect(
    "dbi:Sybase:server=$Srv;database=$Db", 
    $user, $passwd, 
) or die sprintf 'Could not connect to database: %s', DBI->errstr;

my $sth = $dbh->prepare(
    'INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)'
) or die sprintf 'Could not prepare statement: %s', $dbh->errstr;

my @ids = qw( a b c);
my @names = qw( d e f );
my @addresses = qw( g h i);

my $it = each_array(@ids, @names, @address);
while ( my @data = $it->() ) {
    $sth->execute( @data )
        or die sprintf 'Could not execute statement: %s', $sth->errstr;
}

$dbh->commit
    or die sprintf 'Could not commit updates: %s', $dbh->errstr;

$dbh->disconnect;

请注意,代码未经过测试。

您可能还想阅读常见问题解答:What's wrong with always quoting "$vars"?

此外,鉴于您处理错误的唯一方法是死亡,您可能需要考虑在{ RaiseError => 1 }电话中指定connect

答案 2 :(得分:0)

你怎么能不确定你的数组包含什么?无论如何,方法将是迭代通过一个数组并假设其他数组具有相应的值将这些放入插入语句

答案 3 :(得分:0)

另一种方法是使用散列作为中间存储区域。 IE:

my $hash = {};
foreach(@array1) {
  $hash->{id} = $array1[$_];
  $hash->{name} = $array2[$_];
  $hash->{address} = $array3[$_];
}
foreach( keys %$hash ) {
  $sql = "insert into table values(?,?,?)";
  $sth = $dbh->prepare($sql) or die;
  $sth->execute($hash->{id}, $hash->{name}, $hash->{address}) or die;
}

虽然这又取决于同步的三个阵列。但是你可以修改它来在第一个循环到array1中的其他数组中进行值修改或检查或greps(即:如果你在array2和array3中的值可能存储为“NN-name”和“NN-address”,其中NN是来自第一个数组的id,你需要找到相应的值,并删除NN-与//正则表达式)。取决于您的数据结构如何。

另一个注意事项是检查Class :: DBI,看看它是否可以提供更好,更面向对象的方式来获取数据。