4

ハッシュ変数に大量のデータを保存したり、条件に応じてデータを取得したりすることがよくあります。不便なのでNoSQLとしてSQLでデータアクセスするモジュールが欲しい。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_);
4

2 に答える 2

2

https://metacpan.org/module/DBIx::DataModelをお勧めします。

ターゲット テーブルを記述するスキーマをセットアップしたら (これはリバース エンジニアリングによって自動的に行うことができます)、次のようにハッシュを直接挿入できます。

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

実際、DBIx::DataModel に hash_refs の配列を渡すことができ(質問に従って)、これらのそれぞれを挿入します。次のドキュメントを参照してください: https://metacpan.org/module/DBIx::DataModel#Insert

于 2013-07-02T04:29:11.757 に答える
0

私の理解が正しければ、操作が難しい複雑な構造にデータを格納していることになります。NoSQL タイプのものについて質問している理由は、データを簡単に保存および操作する方法が必要だからです。

それなら、袖をまくり上げてObject Oriented 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.";
    }
}
于 2013-07-03T00:51:15.447 に答える