NAME

DBIx::DataModel::Doc::Delta_v1 - Differences introduced in version 1.0

DESCRIPTION

This document is a short enumeration of the main differences introduced in version DBIx::DataModel version 1.0.

SCHEMA DECLARATION

Chained declarations

DBIx::DataModel
->Schema(qw/MySchema ..../)
->Table(qw/Table1 .../)
->Table(qw/Table2 .../)
...
->Association(...)
->

instead of

DBIx::DataModel->Schema(qw/MySchema ..../);

MySchema->Table(qw/Table1 .../);
MySchema->Table(qw/Table2 .../);
...
MySchema->Association(...);
MySchema->

Implicit schema name in declarations

->Table(qw/Table1 .../)
...
->Association([qw/Table1 .../],
              [qw/Table2 .../])

instead of

->Table(qw/MySchema::Table1 .../)
...
->Association([qw/MySchema::Table1 .../],
              [qw/MySchema::Table2 .../])

but explicit prefix is still possible

->Table(qw/My::Other::Namespace::Table1 .../)
...
->Association([qw/My::Other::Namespace::Table1 .../],
              [qw/My::Other::Namespace::Table2 .../])

Automatic schema skeleton.

perl -MDBIx::DataModel::Schema::Generator      \
     -e "fromDBI('dbi:connection:string')" --  \
     -schema My::New::Schema > My/New/Schema.pm

perl -MDBIx::DataModel::Schema::Generator      \
     -e "fromDBIxClass('Some::DBIC::Schema')" -- \
     -schema My::New::Schema > My/New/Schema.pm

sqlt -f <parser> -t DBIx::DataModel::Schema::Generator <parser_input>

See DBIx::DataModel::Schema::Generator.

SCHEMA USAGE

Renamed classes

For a global view of the class hierarchy, see "Classes" in DBIx::DataModel::Doc::Design.

AbstractBase => Source

Classes Table and View both inherit from Source instead of AbstractTable. This internal change should be mostly invisible to users.

Cursor => Statement

The former Cursor class is now called Statement, because it has several new methods for managing the lifecycle of a query statement to the database (bind, sqlize, prepare, execute, etc.).

Renamed methods

ViewFromRoles => join

my $view = MySchema->join(qw/Table role1 role2 .../)

instead of

my $view = MySchema->ViewFromRoles(qw/Table role1 role2 .../)

selectFromRoles => join->select

my $list = $obj->join(qw/role1 role2 .../)
               ->select(-columns => ...
                        -where   => ...);

instead of

my $list = $obj->selectFromRoles(qw/role1 role2 .../)
               ->(-columns => ...
                  -where   => ...);

MethodFromRoles => MethodFromJoin

My::Table->MethodFromJoin(method => qw/role1 role2 .../);

instead of

My::Table->MethodFromRoles(method => qw/role1 role2 .../);

New methods

Statement prepare, bind, execute

See the design doc and reference doc (lifecycle, named placeholders, etc.).

Table->join

New class method join in a table or view produces a statement that can be executed on instances of that table or view.

my $stmt = My::Table->join(qw/role1 role2 .../);
$stmt->prepare;                           

foreach my $obj (@instances_of_my_table) {
  my $list = $stmt->execute($obj)->all;
  ...
  # or
  $stmt->execute($obj);
  while (my $row = $stmt->next) {
    ...
  }
}  

fetch_cached

My::Table->fetch_cached(@primary_key);

dbiPrepareMethod

MySchema->dbiPrepareMethod('prepareCached');

ALIASING

Table aliases

MySchema->join(qw/Table|a1 role1|a2 .../)
        ->select(-columns => [qw/a1.c1 a1.c2 a2.c1 a2.c2 .../])

Source prefixes in joins

..->join(qw/FirstTable role1|r1 FirstTable.role2 r1.role3|r3 role2.role4/)

Column handlers follow aliases

My::Table->ColumnType(Date => qw/date1 date2 .../);
...
my $rows = My::Table->select(-columns => qw/date1|d1 date2|d2 .../);

MISC

Fast statements

my $stmt = $source->select(-columns  => ...
                           -where    => ...
                           -resultAs => 'fast_statement');
while (my $row = $stmt->next) {
  work_immedately_with($row);
}                   
                 

Result as flat arrayref

my $pairs = MySchema::People->select(-columns  => [qw/pers_id firstname/],
                                     -resultAs => 'flat_arrayref');
my %hash = @$pairs;