Как я могу получить имена столбцов и данные строки в порядке с DBI в Perl?

Я использую DBI для запросов базы данных SQLite3. Что у меня есть работы, но это не возвращает столбцы в порядке. Пример:

Query:  select col1, col2, col3, col4 from some_view;
Output:

    col3, col2, col1, col4
    3, 2, 1, 4
    3, 2, 1, 4
    3, 2, 1, 4
    3, 2, 1, 4
    ...

(values and columns are just for illustration)

Я знаю, что это происходит, потому что я использую хеш, но как еще я возвращаю имена столбцов, если я только использую массив? Все, что я хочу сделать, получают что-то вроде этого для любого произвольного запроса:

    col1, col2, col3, col4
    1, 2, 3, 4
    1, 2, 3, 4
    1, 2, 3, 4
    1, 2, 3, 4
    ...

(Таким образом, мне нужен вывод, находится в правильном порядке и с именами столбцов.)

Я - в значительной степени новичок Perl, но я действительно думал, что это будет простой проблемой. (Я сделал это прежде в Ruby и PHP, но я испытываю затруднения при разыскивании того, что я ищу в документации Perl.)

Вот срезанная версия того, что я имею в данный момент:

use Data::Dumper;
use DBI;

my $database_path = '~/path/to/db.sqlite3';

$database = DBI->connect(
  "dbi:SQLite:dbname=$database_path",
  "",
  "",
  {
    RaiseError => 1,
    AutoCommit => 0,
  }
) or die "Couldn't connect to database: " . DBI->errstr;

my $result = $database->prepare('select col1, col2, col3, col4 from some_view;')
    or die "Couldn't prepare query: " . $database->errstr;

$result->execute
    or die "Couldn't execute query: " . $result->errstr;

########################################################################################### 
# What goes here to print the fields that I requested in the query?
# It can be totally arbitrary or '*' -- "col1, col2, col3, col4" is just for illustration.
# I would expect it to be called something like $result->fields
########################################################################################### 

while (my $row = $result->fetchrow_hashref) {
    my $csv = join(',', values %$row);
    print "$csv\n";
}

$result->finish;

$database->disconnect;
12
задан rhavin 19 January 2014 в 12:12
поделиться

2 ответа

Замените комментарий "what goes here" и следующий цикл на:

my $fields = join(',', @{ $result->{NAME_lc} });
print "$fields\n";

while (my $row = $result->fetchrow_arrayref) {
    my $csv = join(',', @$row);
    print "$csv\n";
}

NAME_lc имена полей приводятся в нижнем регистре. Вы также можете использовать NAME_uc для верхнего регистра, или NAME для любого регистра, в котором база данных решит их вернуть.

Вам также, вероятно, следует использовать Text::CSV или Text::CSV_XS вместо того, чтобы пытаться создать свой собственный CSV-файл, но это уже другой вопрос.

15
ответ дан 2 December 2019 в 07:21
поделиться

Вы запрашиваете результат в виде хеша. Хэш по своей сути неупорядочен. Возможно, вы хотите вместо этого fetchrow_arrayref .

Фактически, если бы вы посмотрели на keys% $ row , вы бы увидели, что соответствующие ключи также вышли из строя. Такова природа хэша ... каждый ключ связан со своим значением, но общий порядок ключей или значений оптимизирован для доступа, а не внешнего порядка.

1
ответ дан 2 December 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: