Возможно ли DBIx :: Class :: Schema :: Loader dbicdump автоматически добавить сериализатор для JSYNC - PullRequest
1 голос
/ 09 ноября 2019

Я запускаю

dbicdump -o dump_directory=./lib \
          -o components='["InflateColumn::DateTime", "InflateColumn::Serializer"]' \
          -o debug=1 \
          -o db_schema=foo \
          -o qualify_objects=1 \
          Foo::Schema \
          'dbi:Pg:dbname=foo' username password

для базы данных Postgres с надеждой, что сгенерированная схема сгенерирует код, необходимый для раздувания меток времени и типов столбцов JSON.

Просмотр сгенерированнойВ файлах схемы я вижу строку

__PACKAGE__->load_components("InflateColumn::Serializer", "InflateColumn::DateTime");

, но теперь мне нужно добавить serializer_class => 'JSYNC' к каждому из столбцов JSON, которые я хочу накачать и спустить.

Есть ли способ заставить dbicdump делать это автоматически или ожидается, что вы вручную установите эти методы доступа?

Спасибо!

1 Ответ

1 голос
/ 14 ноября 2019

Не уверен, что это возможно из программы dbicdump, но если вы используете следующую Perl-программу, вы можете делать именно то, что я хочу:

#!/usr/bin/env perl
use strict;
use warnings;
use DBIx::Class::Schema::Loader qw/make_schema_at/;

make_schema_at(
    'Foo::Schema',
    {
        dump_directory => './lib',
        components     => [ "InflateColumn::Serializer", "InflateColumn::DateTime" ],
        db_schema      => 1,
        qualify_objects => 1,
        custom_column_info => sub {
            my ($table, $column_name, $column_info) = @_;
            if ( $column_info->{data_type} eq "json" ) {
                return { serializer_class => "JSYNC" };
            }
        },
    },
    [
         "dbi:Pg:dbname=foo',
         "username",
         "password"
     ]
);

Надеюсь, это сэкономит кому-то время на исследования.

...