当前位置:  开发笔记 > 编程语言 > 正文

如何在Perl中使用DBI获取列名和行数据?

如何解决《如何在Perl中使用DBI获取列名和行数据?》经验,为你挑选了1个好方法。

我正在使用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文件,但这是另一个问题.



1> cjm..:

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

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有