DBIx::MoCoで複数レコードの同時インサート
Data::ObjectDriverでいうbulk_insertとか、DBICのpolulateみたいなやつ。
というか、Data::ObjectDriverで使ってるbulk_insertをほぼ丸コピしました。
#ported from Data::ObjectDriver::DBD::mysql sub bulk_insert { my $class = shift; my $dbh = $class->db->dbh; my $table = $class->table; my $cols = shift; my $rows_ref = shift; croak "Usage bulk_insert(dbh, table, columnref, rowsref)" unless (defined $dbh && defined $table && defined $cols && defined $rows_ref); return 0e0 if (scalar(@{$rows_ref}) == 0); my $sql = "INSERT INTO $table(" . join(',', @{$cols}) . ") VALUES\n"; my $statement_length = length($sql); my @rows; foreach my $row (@{$rows_ref}) { my $line = join(',', map { defined($_) ? $dbh->quote($_) : 'NULL'} @{$row}); $statement_length += length($line); push @rows, "(${line})"; } $sql .= join ",\n", @rows; # For now just write all data, at some point we need to lookup the # maximum packet size for SQL return $dbh->do($sql); }
とりあえず動いた。inflate_columnとかの対応はしてない。