JSON数据和DBIx :: Class - 如何直接存储数据?

时间:2015-12-18 13:54:13

标签: perl postgresql dbix-class

我有一个带有JSON列的Postgres数据库,我想做这样的事情:

== analized-element =====
border-size: 0 0 0 0
padding: 0 0 0 0
font-size: 20px
offsetHeight: 20px
=========================

Foo ::人们看起来像这样:

use lib './lib';
use Digest::MD5 qw(md5 md5_hex);
use Data::Dump qw/dump/;

use Foo; # isa 'DBIx::Class::Schema';

$f = Foo->connect('dbi:Pg:database=mydb');

my $i = $f->resultset('People')->create({ id => md5_hex(rand() . 'some string') });
$i->insert;
$i->data({ name => 'john', surname => 'doe', birthday => '04/07/1976'});

#--------------------------------
# this is the important bit
# assigning to the HoH directly
#--------------------------------
$i->data->{books} = ['1984', 'Wuthering heights'];
$i->update;

然而这不起作用 - 唯一能做的就是将哈希存储在临时值中,更改它,然后再次存储它,如下所示:

__PACKAGE__->add_columns(
  "id",
  { data_type => "varchar", is_nullable => 0, size => 32 },
  "data",
  { data_type => "json", is_nullable => 1, accessor  => '_data', },
);

__PACKAGE__->set_primary_key(qw/id/);

use JSON::XS;
use Data::Dump qw/dump/;

sub data {
    my ($self, $value) = @_;
    if(@_ > 1) {
        my $value = encode_json($value);
        $self->_data($value);
    }
    $value = decode_json($self->_data());
    return $value;
}

有更简洁的方法吗?

1 个答案:

答案 0 :(得分:0)

像在abraxxa的答案中那样对列进行充气/放气工作正常,但我仍然需要明确更新列,否则不会存储取消引用字段的分配。

我最后在列中添加了一个属性,并在更新时添加before Moose钩子,如下所示:

__PACKAGE__->add_columns(
             "id" => { data_type => "varchar", is_nullable => 0, size => 32 },
             "data" => {
                  data_type => "json",
                  is_nullable => 1,
                  always_update => 1
             },
);

before 'update' => sub {
    my $self = shift;
    my %c = $self->get_columns;
    for (grep { $self->result_source->column_info($_)->{always_update} } keys %c) {
        $self->make_column_dirty($_);
    }
};

这样我每次都不需要明确地调用data列的更新。

我不知道这是不是一个坏主意 - 欢迎评论。