=head2 Transactions
As of version 0.04001, there is improved transaction support in
-L<DBIx::Class::Storage::DBI> and L<DBIx::Class::Schema>. Here is an
+L<DBIx::Class::Storage> and L<DBIx::Class::Schema>. Here is an
example of the recommended way to use it:
my $genus = $schema->resultset('Genus')->find(12);
C<next::method>.
sub new {
- my ( $self, $attrs ) = @_;
+ my ( $class, $attrs ) = @_;
$attrs->{foo} = 'bar' unless defined $attrs->{foo};
- $self->next::method($attrs);
+ my $new = $class->next::method($attrs);
- return $self;
+ return $new;
}
For more information about C<next::method>, look in the L<Class::C3>
=head2 Profiling
-When you enable L<DBIx::Class::Storage::DBI>'s debugging it prints the SQL
+When you enable L<DBIx::Class::Storage>'s debugging it prints the SQL
executed as well as notifications of query completion and transaction
begin/commit. If you'd like to profile the SQL you can subclass the
L<DBIx::Class::Storage::Statistics> class and write your own profiling
DBIx::Class is not built for speed, it's built for convenience and
ease of use, but sometimes you just need to get the data, and skip the
-fancy objects. Luckily this is also fairly easy using
-C<inflate_result>:
-
- # Define a class which just returns the results as a hashref:
- package My::HashRefInflator;
-
- ## $me is the hashref of cols/data from the immediate resultsource
- ## $prefetch is a deep hashref of all the data from the prefetched
- ## related sources.
+fancy objects.
+
+To do this simply use L<DBIx::Class::ResultClass::HashRefInflator>.
+
+ my $rs = $schema->resultset('CD');
+
+ $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
+
+ my $hash_ref = $rs->find(1);
+
+Wasn't that easy?
+
+=head2 Get raw data for blindingly fast results
- sub mk_hash {
- my ($me, $rest) = @_;
+If the C<inflate_result> solution above is not fast enough for you, you
+can use a DBIx::Class to return values exactly as they come out of the
+data base with none of the convenience methods wrapped round them.
- return { %$me,
- map { ($_ => mk_hash(@{$rest->{$_}})) } keys %$rest
- };
- }
+This is used like so:-
- sub inflate_result {
- my ($self, $source, $me, $prefetch) = @_;
- return mk_hash($me, $prefetch);
+ my $cursor = $rs->cursor
+ while (my @vals = $cursor->next) {
+ # use $val[0..n] here
}
- # Change the object inflation to a hashref for just this resultset:
- $rs->result_class('My::HashRefInflator');
-
- my $datahashref = $rs->next;
- foreach my $col (keys %$datahashref) {
- if(!ref($datahashref->{$col})) {
- # It's a plain value
- }
- elsif(ref($datahashref->{$col} eq 'HASH')) {
- # It's a related value in a hashref
- }
- }
+You will need to map the array offsets to particular columns (you can
+use the I<select> attribute of C<search()> to force ordering).
=head2 Want to know if find_or_create found or created a row?