=head1 NAME DBIx::DataModel::Doc::Delta_1.0 - Differences introduced in version 1.0 =head1 DESCRIPTION This document is a short enumeration of the main differences introduced in version C<DBIx::DataModel> version 1.0. =head1 SCHEMA DECLARATION =head2 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-> =head2 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 .../]) =head3 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 L<DBIx::DataModel::Schema::Generator>. =head1 SCHEMA USAGE =head2 Renamed classes For a global view of the class hierarchy, see L<DBIx::DataModel::Doc::Design/"Classes">. =head3 AbstractBase => Source Classes C<Table> and C<View> both inherit from L<Source|DBIx::DataModel::Source> instead of C<AbstractTable>. This internal change should be mostly invisible to users. =head3 Cursor => Statement The former C<Cursor> class is now called L<Statement|DBIx::DataModel::Statement>, because it has several new methods for managing the lifecycle of a query statement to the database (C<bind>, C<sqlize>, C<prepare>, C<execute>, etc.). =head2 Renamed methods =head3 ViewFromRoles => join my $view = MySchema->join(qw/Table role1 role2 .../) instead of my $view = MySchema->ViewFromRoles(qw/Table role1 role2 .../) =head3 selectFromRoles => join->select my $list = $obj->join(qw/role1 role2 .../) ->select(-columns => ... -where => ...); instead of my $list = $obj->selectFromRoles(qw/role1 role2 .../) ->(-columns => ... -where => ...); =head3 MethodFromRoles => MethodFromJoin My::Table->MethodFromJoin(method => qw/role1 role2 .../); instead of My::Table->MethodFromRoles(method => qw/role1 role2 .../); =head2 New methods =head3 Statement prepare, bind, execute See the L<design doc|DBIx::DataModel::Doc::Design/"STATEMENT OBJECTS"> and L<reference doc|DBIx::DataModel::Statement> (lifecycle, named placeholders, etc.). =head3 Table->join New class method C<join> in a table or view produces a statement that can be C<execute>d 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) { ... } } =head3 fetch_cached My::Table->fetch_cached(@primary_key); =head3 dbiPrepareMethod MySchema->dbiPrepareMethod('prepareCached'); =head1 ALIASING =head2 Table aliases MySchema->join(qw/Table|a1 role1|a2 .../) ->select(-columns => [qw/a1.c1 a1.c2 a2.c1 a2.c2 .../]) =head2 Source prefixes in joins ..->join(qw/FirstTable role1|r1 FirstTable.role2 r1.role3|r3 role2.role4/) =head2 Column handlers follow aliases My::Table->ColumnType(Date => qw/date1 date2 .../); ... my $rows = My::Table->select(-columns => qw/date1|d1 date2|d2 .../); =head1 MISC =head2 Fast statements my $stmt = $source->select(-columns => ... -where => ... -resultAs => 'fast_statement'); while (my $row = $stmt->next) { work_immedately_with($row); } =head2 Result as flat arrayref my $pairs = MySchema::People->select(-columns => [qw/pers_id firstname/], -resultAs => 'flat_arrayref'); my %hash = @$pairs;