Как я могу написать подпрограмму для вставок DBI с различным количеством значений? - PullRequest
3 голосов
/ 16 февраля 2009

Я делаю много запросов на вставку, и я думаю, что было бы лучше написать подпрограмму для этого. Что-то вроде insertRow($table, @stuff_to_insert). Но как я могу сделать подпрограмму динамической, когда дело доходит до @stuff_to_insert, который может быть любым из 1-5 аргументов?

Ответы [ 4 ]

4 голосов
/ 16 февраля 2009

Лучшим решением, вероятно, является использование системы ORM, такой как DBIx :: Class . Они значительно облегчают работу с SQL.

Если вы решите остаться на сырой DBI, я бы посоветовал вам использовать готовые заявления, как это:

my $query = sprintf 'INSERT INTO %s VALUES(%s)', dbh->quote_identifier($table), join ',', ('?') x $columns;

my $sth = $dbh->prepare($query);

for my $row (@rows) {
    $sth->execute(@{$row});
}

Это будет преимущество в скорости и надежности.

Вы можете заключить все это в подпрограмму, но ORM, вероятно, в любом случае предлагает лучшее решение.

1 голос
/ 16 февраля 2009

Что-то вроде:

sub insertRow
{
    my $table = shift;
    my $placeholders = join(',', map { "?"; } @_); 
    $dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_);
}

Отредактировано: вам нужно добавить undef в качестве параметра. Леон Тиммерманс предлагает не использовать прототипы

0 голосов
/ 16 февраля 2009

Часть передачи параметров достаточно проста:

sub foo {
  my $table = shift;
  my @stuff_to_insert = @_;

  # Do stuff here
}

Неважно, передадите ли вы один параметр, или пять, или пятьдесят, все они превратятся в @stuff_to_insert.

Что касается выполнения реальных запросов, примите совет Леона и используйте подготовленные заявления. (ORM могут быть удобны, но, IMO, они переоценены и являются серьезным излишним в простых случаях.)

0 голосов
/ 16 февраля 2009

Просто передайте ссылку на массив аргументов. Затем в insertRow итерируйте этот массив, чтобы получить аргументы ...

...