[Munich-pm] Elche einfrieren - oder: Alle Wege führen nach ORM

Renee B pm.list at perl-services.de
Di Aug 1 23:13:39 PDT 2017



Am 02.08.2017 um 01:47 schrieb Harald Jörg:
>
> Das soll dann in etwa so aussehen:
>
>   package New::Class;
>   use Moose;
>   extends 'Old::Class';
>   with 'My::MooseX::ORM';
>
>   # ...und dann später...
>   my $object = New::Class->new(%params);
>   my $id = $object->store;
>
>   # am nächsten Tag:
>   my $object = New::Class->load_object($id);
>   my $objects_ref = New::Class->load; # lädt die ganze Tabelle

Ein Ansatz wäre, ein eigenes Attribut für Attribute zu schreiben:

    package DBAttribute;

    use Moose;
    extends 'Moose::Meta::Attribute';

    has is_column => (
        is  => 'rw',
        isa => 'Int',
    );

    no Moose;

    1;

In einer Rolle kannst Du dann folgendes machen:

    package DBRole;

    sub store {
        my ($self, %param) = @_;
        _check_table(); # check if table exists, add the table if it's
missing
        if ( $entry_exists ) {
            $self->_update(%param);
        }
        else {
            $self->_insert(%param);
        }
    }

    sub load { ... }
    sub load_objects { ... }

    sub insert {
        my ($self, %param) = @_;

        my $meta       = $self->meta;
        my @attributes = $meta->get_attribute_list;
        my @columns  = map{ $meta->get_attribute( $_ ) }@attributes;

        my %columns;
        for my $attribute ( @trackable ) {
            if (
                $attribute->isa( 'DBAttribute' ) &&
                $attribute->is_column
            ) {
                my $name = $attribute->name;
                $columns{$name} = $self->$attribute();
            }
        }

        my $table = ...; # get class name from meta data
        my $column_names = join ', ', keys %columns;
        my $placeholders     = join ', ', ('?') x keys %columns;

        my $SQL = "INSERT INTO $table ( $column_names ) values (
$placeholders )";
        $sth->execute( values %columns );
    }

In der New::Class dann:

  package New::Class;
  use Moose;
  extends 'Old::Class';
  with 'My::MooseX::ORM';
  with 'DBRole';

  has id => (
      is => 'ro',
      isa => Int,
      is_column => 1,
  );

  # ...und dann später...
  my $object = New::Class->new(%params);
  my $id = $object->store;

  # am nächsten Tag:
  my $object = New::Class->load_object($id);
  my $objects_ref = New::Class->load; # lädt die ganze Tabelle


Du musst Dir aber noch überlegen, wie Du mehr Spalteninformationen (z.B. Datentyp) etc. ablegen willst oder ob Du das auf Basis vorhandener Werte ermitteln willst...

- Renée


Mehr Informationen über die Mailingliste Munich-pm