#perl #csv #dbi #columnname
#csv #perl #dbi
Вопрос:
Как я могу получить column-names
из таблицы? Это не сработало:
#!/usr/bin/env perl
use warnings;
use 5.012;
use DBI;
my $options = { RaiseError => 1, PrintError => 0, f_ext => ".csv/r" };
my $dbh = DBI->connect( "dbi:CSV:", undef, undef, $options ) or die $DBI::errstr;
my $table = 'test';
$dbh->do( "CREATE TEMP TABLE $table ( id INT, size INT )" );
my $sth = $dbh->prepare( "INSERT INTO $table ( id, size ) VALUES( ?, ? )" );
$sth->execute( 1, 235 );
$sth->execute( 2, 42 );
use Data::Dumper;
say Dumper $dbh->{csv_tables}{$table}{col_names};
$dbh->{csv_tables}{$table} = { skip_first_row => 0 };
$sth = $dbh->prepare( "SELECT * FROM $table" );
$sth->execute;
my @first_row = $sth->fetchrow_array;
say "@first_rown";
$sth = $dbh->column_info( '', '', $table, '' );
my $ref = $sth->fetchall_arrayref;
say "@$_" for @$ref;
Ошибка:
$VAR1 = undef;
1 235
Can't call method "fetchall_arrayref" on an undefined value at ./so.pl line 25.
Ответ №1:
column_info
Метод должен быть реализован драйвером, и вы получите, undef
если этого не было.
Вместо этого я бы посмотрел на $sth->{NAME}
после того, как вы выполнили первый запрос.
Кстати, DBD::CSV
это забавная игрушка, но если вам нужна облегченная одноразовая база данных, я настоятельно рекомендую использовать DBD::SQLite
вместо этого. И если вам просто нужно обрабатывать данные CSV, есть несколько достойных модулей, которые предоставляют вам необработанный доступ. Между этими двумя, осталось очень мало вариантов использования, в которых DBD::CSV
было бы много смысла.