免责声明:我第一次使用DBI。
我有一个MySQL表格,里面有很多索引字段(f1、f2、f3等),这些字段被长时间运行的进程用来生成WHERE子句,这些进程迭代数据库的块,执行各种清理和测试操作。
目前这个代码的版本工作方式如下:
sub get_list_of_ids() {
my ($value1, $value2, $value3...) = @_;
my $stmt = 'SELECT * FROM files WHERE 1';
my @args;
if (defined($value1)) {
$stmt .= ' AND f1 = ?';
push(@args, $value1);
}
# Repeat for all the different fields and values
my $select_sth = $dbh->prepare($stmt) or die $dbh->errstr;
$select_sth->execute(@args) or die $select_sth->errstr;
my @result;
while (my $array = $select_sth->fetch) {
push(@result, $$array[0]);
}
return \@result;
}
sub function_A() {
my ($value1, $value2, $value3...) = @_;
my $id_aref = get_list_of_ids($value1, $value2, $value3...);
foreach my $id (@$id_aref) {
# Do something with $id
# And something else with $id
}
}
sub function_B() {
my ($value1, $value2, $value3...) = @_;
my $id_aref = get_list_of_ids($value1, $value2, $value3...);
foreach my $id (@$id_aref) {
# Do something different with $id
# Maybe even delete the row
}
}
无论如何,我将要在数据库中插入更多的行,但我清楚上述代码无法扩展。我可以根据其他语言想到几种解决方法。在Perl中处理它的最佳方式是什么?
需要注意的关键点是:get_list_of_ids()
中的逻辑过于冗长,无法在每个函数中复制;而选择行上的操作非常多样化。
提前致谢。
selectcol_arrayref()
中。通常情况下,您不能信任keys
和values
的顺序,但是对于相同未修改的哈希,它们保证以相同的顺序返回。 - Schwernselectcol_arrayref
会简化get_ids()逻辑,使我可以在需要它的每个函数中重复使用它。我会尝试一下。我也会查看DBIx::Class,谢谢。 - Anon Gordon