簡體   English   中英

是否有用於使用SQL語言訪問復雜結構數據的Perl模塊?

[英]Is there a Perl module for accessing complex structure data with SQL language?

我經常將大量數據保存到一個哈希變量中,或者根據條件獲取數據。 這不方便,所以我想要一個模塊,通過該模塊可以將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_);

我建議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

如果我理解正確,那么您將數據存儲在難以操縱的復雜結構中。 之所以問NoSQL類型的東西,是因為您想要一種簡單的方法來存儲和處理數據。

然后是時候卷起袖子,學習面向對象的Perl了

創建Perl對象是處理復雜數據結構的好方法,而且學習起來並不難。 我通常會即時編寫類,並在程序末尾聲明它們。

這是您在最初的帖子中作為Company類擁有的數據結構:

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.";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM