13

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;
4

6 に答える 6

18

「ここに何が入るか」というコメントと次のループを次のように置き換えます。

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データベースがそれらを返すと決定した場合に使用することもできます。

また、独自の CSV ファイルを作成しようとする代わりに、おそらくText::CSVまたはText::CSV_XSを使用する必要がありますが、それは別の問題です。

于 2010-02-17T18:15:12.043 に答える
2

順序を維持したいが、ハッシュを使用してフィールドを名前で参照する場合は、次のようにします。

$dbh->selectall_arrayref($sql,{ Slice => {} } );

これにより、順序付けられたハッシュの配列が得られます

于 2014-01-27T06:53:36.953 に答える
1

結果をハッシュとして求めています。ハッシュは本質的に順不同です。おそらくあなたはfetchrow_arrayref代わりに欲しいです。

実際、 を見ていればkeys %$row、対応するキーも順不同であることがわかります。それがハッシュの性質です...各キーはその値とペアになっていますが、キーまたは値の全体的な順序は、外部順序ではなく、アクセス用に最適化されています。

于 2010-02-17T17:49:33.257 に答える
1

これが私がすることです:

    use Data::Dump qw(dump);
    # get column names in array
    my @column_names_array= $sth->{NAME};  
    # print out column names in pretty format
    print "Field names: \n";
    dump(@column_names_array);
于 2015-06-09T17:35:38.577 に答える