我经常将大量数据保存到哈希变量中,或根据条件获取数据。这不方便,所以我想要一个用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_);
答案 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.";
}
}