我正在使用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;
cjm.. 15
用以下内容替换"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文件,但这是另一个问题.
用以下内容替换"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文件,但这是另一个问题.