Skip to content

Bulk Insert support? #61

@KnowZero

Description

@KnowZero

It would be nice to support multiple inserts in a single statement, especially non-blocking.

Maybe something like this?

my @values = [ [ 'cat', 1 ], [ 'dog', 2 ] ];
 $abstract->insert( 'pets' => {  -values=>\@values }  );

my @keys = [ 'name', 'rank' ];
 $abstract->insert( 'pets' => { -keys=> \@keys,  -values=>\@values }  );

my @keyvalues = [ { name=>'cat', rank=>1 }, { name=>'dog', rank=>2 }  ];
 $abstract->insert( 'pets' => {  -keyvalues=>\@keyvalues }  );

Then backend something like this?

sub _insert_HASHREF { 
  my ($self, $data) = @_;

if ( ref $$data{'-keyvalues'} eq 'ARRAY' ) {
$$data{'-keys'}=[ sort keys %{ $$data{'-keyvalues'}[0] } ];
$$data{'-values'} = [ map {   
    my $keyvalues=$_;
    [ map {  $$keyvalues{ $_ }  } @{ $$data{'-keys'} }  ]   
    } @{ $$data{'-keyvalues'} } ];
}
   
   return $self->SUPER::_insert_HASHREF($data) if ref $$data{'-values'} ne 'ARRAY';
 


my @fields = @{$$data{'-keys'}};
 

   my ( @all_bind, @all_values);
  foreach my $rec (@{ $$data{'-values'} }) { 
      my @values;
    foreach my $value (@$rec) {

      my ($values, @bind) = $self->_insert_value(undef, $value);
      push @values, $values;
      push @all_bind, @bind;
    }

    push @all_values, \@values;
  }
  my $sql = ( exists $$data{'-keys'} ? "( ".join(", ", @fields )." ) ":'' ).
              $self->_sqlcase('values').
              join(',', map{ " ( ".join(", ", @$_)." )" } @all_values  );

  return ($sql, @all_bind);

}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions