是否有用于使用SQL语言访问复杂结构数据的Perl模块?

时间:2013-06-11 14:21:47

标签: perl perl-module perl-data-structures

我经常将大量数据保存到哈希变量中,或根据条件获取数据。这不方便,所以我想要一个用SQL作为NoSQL访问数据的模块。我找到DBD::RAM,但是有一个较小的模块吗?

例如:像MySQL表这样的哈希数据:

{
   "table": "company",
   "rows" : [
       {
         "name": "baidu",
         "location": "China"
       },
       {
         "name": "taobao",
         "location": "China"
       }
    ]
}

通常,插入如下记录:

my %new_row = (name=>xxx, location=>yyy);
push (@{$hash->{rows}}, \%new_row);

如果我这样做,会有很多哈希变量,所以我想更像这样:

$handle->insert('insert into company values("xxx", "yyy")');

my ($name, $location) = $handle->select_unqiue_record(<<"_EOC_";
    select name, location from company where name="baidu"
_EOC_);

2 个答案:

答案 0 :(得分:2)

我建议https://metacpan.org/module/DBIx::DataModel

设置描述目标表的Schema后 - 您可以通过逆向工程自动执行此操作 - 您可以直接插入哈希:

my $table = $schema->table($table_name);
my $id = $table->insert($hash_ref);

实际上你可以传递DBIx :: DataModel一个hash_refs数组(根据你的问题),它会为你插入每一个。请参阅以下文档:https://metacpan.org/module/DBIx::DataModel#Insert

答案 1 :(得分:0)

如果我理解正确,那么您将数据存储在难以操作的复杂结构中。您询问NoSQL类型的原因是您想要一种简单的方法来存储和操作您的数据。

现在是时候卷起袖子并学习Object Oriented Perl

创建Perl对象是处理复杂数据结构的好方法,而且实际上并不是很难学习。我通常会动态编写课程,并在程序结束时声明它们。

这是您在初始帖子中作为公司类的数据结构:

package Company;

sub new {
    my $class    = shift;
    my $name     = shift;
    my $location = shift;

    my $self = {};
    bless $self, $class;

    $self->Name($name);
    $self->Location($location);
    return $self;
}

sub Name {
    my $self     = shift;
    my $name     = shift;

    if ( defined $name ) {
        $self->{NAME} = $name;
    }
    return $self->{NAME};
}

sub Location {
    my $self      = shift;
    my $location  = shift;

    if ( defined $location ) {
        $self->{LOCATION} = $location;
    }
    return $self->{$LOCATION};
}

这就是它的全部。现在,我可以轻松地创建和操作我的公司,而不必担心操纵哈希值,或者试图记住我的数据结构:

# Read in all of the companies from $company_file into @company_list

open my $company_fh, "<", $company_file;
my @company_list;
while ( my $line = <$company_fh> ) {
    chomp $line;
    my ($name, $location) = split /:/, $line;
    my $company = Company->new( $name, $location );
    push @company_list, $company;
}
close $company_fh;

稍后,我可以像这样操纵我的公司:

#Print out all Chinese Companies
for my $company ( @company_list ) {
    if ( $company->Location eq "China" ) {
        say $company->Name . " is located in China.";
    }
}