in reply to Re: Select DB data into CSV file
in thread Select DB data into CSV file

If performance is an issue, do not take a copy of the list every time, use the reference:

my $rs = $schema->resultset ("UrTable")->search ({ ur => "search" }); my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, eol => "\r +\n" }) or die "Cannot use CSV: ", Text::CSV_XS->error_diag; my @headers = $rs->result_source->columns; $csv->print (*STDOUT, \@headers); # ^ my $cursor = $rs->cursor; while (my @vals = $cursor->next) { $csv->print (*STDOUT, \@vals); # ^ }

I should also note that say has runtime overhead. For top-speed, use the eol attribute and print.

*STDOUT does not require the backslach in Text::CSV_XS (I just verified with 5.8.1 and Text::CSV_XS-1.12).

Performance-wise it is a shame that DBIx::Class::Cursor's next (got to DBIx::Class::ResultSet's next for the actual documentation) uses DBI's fetchrow_array instead of the faster and more efficient fetchrow_arrayref (or it's alias fetch), which could then directly be passed to $csv->print.


Enjoy, Have FUN! H.Merijn