Add notes about handling of inflated objects in resultset conditions
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Manual / Cookbook.pod
1 =head1 NAME
2
3 DBIx::Class::Manual::Cookbook - Miscellaneous recipes
4
5 =head1 SEARCHING
6
7 =head2 Paged results
8
9 When you expect a large number of results, you can ask L<DBIx::Class> for a
10 paged resultset, which will fetch only a defined number of records at a time:
11
12   my $rs = $schema->resultset('Artist')->search(
13     undef,
14     {
15       page => 1,  # page to return (defaults to 1)
16       rows => 10, # number of results per page
17     },
18   );
19
20   return $rs->all(); # all records for page 1
21
22   return $rs->page(2); # records for page 2
23
24 You can get a L<Data::Page> object for the resultset (suitable for use
25 in e.g. a template) using the C<pager> method:
26
27   return $rs->pager();
28
29 =head2 Complex WHERE clauses
30
31 Sometimes you need to formulate a query using specific operators:
32
33   my @albums = $schema->resultset('Album')->search({
34     artist => { 'like', '%Lamb%' },
35     title  => { 'like', '%Fear of Fours%' },
36   });
37
38 This results in something like the following C<WHERE> clause:
39
40   WHERE artist LIKE ? AND title LIKE ?
41
42 And the following bind values for the placeholders: C<'%Lamb%'>, C<'%Fear of
43 Fours%'>.
44
45 Other queries might require slightly more complex logic:
46
47   my @albums = $schema->resultset('Album')->search({
48     -or => [
49       -and => [
50         artist => { 'like', '%Smashing Pumpkins%' },
51         title  => 'Siamese Dream',
52       ],
53       artist => 'Starchildren',
54     ],
55   });
56
57 This results in the following C<WHERE> clause:
58
59   WHERE ( artist LIKE '%Smashing Pumpkins%' AND title = 'Siamese Dream' )
60     OR artist = 'Starchildren'
61
62 For more information on generating complex queries, see
63 L<SQL::Abstract/WHERE CLAUSES>.
64
65 =head2 Retrieve one and only one row from a resultset
66
67 Sometimes you need only the first "top" row of a resultset. While this
68 can be easily done with L<< $rs->first|DBIx::Class::ResultSet/first
69 >>, it is suboptimal, as a full blown cursor for the resultset will be
70 created and then immediately destroyed after fetching the first row
71 object.  L<< $rs->single|DBIx::Class::ResultSet/single >> is designed
72 specifically for this case - it will grab the first returned result
73 without even instantiating a cursor.
74
75 Before replacing all your calls to C<first()> with C<single()> please observe the
76 following CAVEATS:
77
78 =over
79
80 =item *
81
82 While single() takes a search condition just like search() does, it does
83 _not_ accept search attributes. However one can always chain a single() to
84 a search():
85
86   my $top_cd = $cd_rs->search({}, { order_by => 'rating' })->single;
87
88
89 =item *
90
91 Since single() is the engine behind find(), it is designed to fetch a
92 single row per database query. Thus a warning will be issued when the
93 underlying SELECT returns more than one row. Sometimes however this usage
94 is valid: i.e. we have an arbitrary number of cd's but only one of them is
95 at the top of the charts at any given time. If you know what you are doing,
96 you can silence the warning by explicitly limiting the resultset size:
97
98   my $top_cd = $cd_rs->search ({}, { order_by => 'rating', rows => 1 })->single;
99
100 =back
101
102 =head2 Arbitrary SQL through a custom ResultSource
103
104 Sometimes you have to run arbitrary SQL because your query is too complex
105 (e.g. it contains Unions, Sub-Selects, Stored Procedures, etc.) or has to
106 be optimized for your database in a special way, but you still want to
107 get the results as a L<DBIx::Class::ResultSet>.
108
109 This is accomplished by defining a
110 L<ResultSource::View|DBIx::Class::ResultSource::View> for your query,
111 almost like you would define a regular ResultSource.
112
113   package My::Schema::Result::UserFriendsComplex;
114   use strict;
115   use warnings;
116   use base qw/DBIx::Class::Core/;
117
118   __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
119
120   # ->table, ->add_columns, etc.
121
122   # do not attempt to deploy() this view
123   __PACKAGE__->result_source_instance->is_virtual(1);
124
125   __PACKAGE__->result_source_instance->view_definition(q[
126     SELECT u.* FROM user u
127     INNER JOIN user_friends f ON u.id = f.user_id
128     WHERE f.friend_user_id = ?
129     UNION
130     SELECT u.* FROM user u
131     INNER JOIN user_friends f ON u.id = f.friend_user_id
132     WHERE f.user_id = ?
133   ]);
134
135 Next, you can execute your complex query using bind parameters like this:
136
137   my $friends = $schema->resultset( 'UserFriendsComplex' )->search( {},
138     {
139       bind  => [ 12345, 12345 ]
140     }
141   );
142
143 ... and you'll get back a perfect L<DBIx::Class::ResultSet> (except, of course,
144 that you cannot modify the rows it contains, e.g. cannot call L</update>,
145 L</delete>, ...  on it).
146
147 Note that you cannot have bind parameters unless is_virtual is set to true.
148
149 =over
150
151 =item * NOTE
152
153 If you're using the old deprecated C<< $rsrc_instance->name(\'( SELECT ...') >>
154 method for custom SQL execution, you are highly encouraged to update your code
155 to use a virtual view as above. If you do not want to change your code, and just
156 want to suppress the deprecation warning when you call
157 L<DBIx::Class::Schema/deploy>, add this line to your source definition, so that
158 C<deploy> will exclude this "table":
159
160   sub sqlt_deploy_hook { $_[1]->schema->drop_table ($_[1]) }
161
162 =back
163
164 =head2 Using specific columns
165
166 When you only want specific columns from a table, you can use
167 C<columns> to specify which ones you need. This is useful to avoid
168 loading columns with large amounts of data that you aren't about to
169 use anyway:
170
171   my $rs = $schema->resultset('Artist')->search(
172     undef,
173     {
174       columns => [qw/ name /]
175     }
176   );
177
178   # Equivalent SQL:
179   # SELECT artist.name FROM artist
180
181 This is a shortcut for C<select> and C<as>, see below. C<columns>
182 cannot be used together with C<select> and C<as>.
183
184 =head2 Using database functions or stored procedures
185
186 The combination of C<select> and C<as> can be used to return the result of a
187 database function or stored procedure as a column value. You use C<select> to
188 specify the source for your column value (e.g. a column name, function, or
189 stored procedure name). You then use C<as> to set the column name you will use
190 to access the returned value:
191
192   my $rs = $schema->resultset('Artist')->search(
193     {},
194     {
195       select => [ 'name', { LENGTH => 'name' } ],
196       as     => [qw/ name name_length /],
197     }
198   );
199
200   # Equivalent SQL:
201   # SELECT name name, LENGTH( name )
202   # FROM artist
203
204 Note that the C<as> attribute B<has absolutely nothing to do> with the SQL
205 syntax C< SELECT foo AS bar > (see the documentation in
206 L<DBIx::Class::ResultSet/ATTRIBUTES>). You can control the C<AS> part of the
207 generated SQL via the C<-as> field attribute as follows:
208
209   my $rs = $schema->resultset('Artist')->search(
210     {},
211     {
212       join => 'cds',
213       distinct => 1,
214       '+select' => [ { count => 'cds.cdid', -as => 'amount_of_cds' } ],
215       '+as' => [qw/num_cds/],
216       order_by => { -desc => 'amount_of_cds' },
217     }
218   );
219
220   # Equivalent SQL
221   # SELECT me.artistid, me.name, me.rank, me.charfield, COUNT( cds.cdid ) AS amount_of_cds
222   #   FROM artist me LEFT JOIN cd cds ON cds.artist = me.artistid
223   # GROUP BY me.artistid, me.name, me.rank, me.charfield
224   # ORDER BY amount_of_cds DESC
225
226
227 If your alias exists as a column in your base class (i.e. it was added with
228 L<add_columns|DBIx::Class::ResultSource/add_columns>), you just access it as
229 normal. Our C<Artist> class has a C<name> column, so we just use the C<name>
230 accessor:
231
232   my $artist = $rs->first();
233   my $name = $artist->name();
234
235 If on the other hand the alias does not correspond to an existing column, you
236 have to fetch the value using the C<get_column> accessor:
237
238   my $name_length = $artist->get_column('name_length');
239
240 If you don't like using C<get_column>, you can always create an accessor for
241 any of your aliases using either of these:
242
243   # Define accessor manually:
244   sub name_length { shift->get_column('name_length'); }
245
246   # Or use DBIx::Class::AccessorGroup:
247   __PACKAGE__->mk_group_accessors('column' => 'name_length');
248
249 See also L</Using SQL functions on the left hand side of a comparison>.
250
251 =head2 SELECT DISTINCT with multiple columns
252
253   my $rs = $schema->resultset('Artist')->search(
254     {},
255     {
256       columns => [ qw/artist_id name rank/ ],
257       distinct => 1
258     }
259   );
260
261   my $rs = $schema->resultset('Artist')->search(
262     {},
263     {
264       columns => [ qw/artist_id name rank/ ],
265       group_by => [ qw/artist_id name rank/ ],
266     }
267   );
268
269   # Equivalent SQL:
270   # SELECT me.artist_id, me.name, me.rank
271   # FROM artist me
272   # GROUP BY artist_id, name, rank
273
274 =head2 SELECT COUNT(DISTINCT colname)
275
276   my $rs = $schema->resultset('Artist')->search(
277     {},
278     {
279       columns => [ qw/name/ ],
280       distinct => 1
281     }
282   );
283
284   my $rs = $schema->resultset('Artist')->search(
285     {},
286     {
287       columns => [ qw/name/ ],
288       group_by => [ qw/name/ ],
289     }
290   );
291
292   my $count = $rs->count;
293
294   # Equivalent SQL:
295   # SELECT COUNT( * ) FROM (SELECT me.name FROM artist me GROUP BY me.name) me:
296
297 =head2 Grouping results
298
299 L<DBIx::Class> supports C<GROUP BY> as follows:
300
301   my $rs = $schema->resultset('Artist')->search(
302     {},
303     {
304       join     => [qw/ cds /],
305       select   => [ 'name', { count => 'cds.id' } ],
306       as       => [qw/ name cd_count /],
307       group_by => [qw/ name /]
308     }
309   );
310
311   # Equivalent SQL:
312   # SELECT name, COUNT( cd.id ) FROM artist
313   # LEFT JOIN cd ON artist.id = cd.artist
314   # GROUP BY name
315
316 Please see L<DBIx::Class::ResultSet/ATTRIBUTES> documentation if you
317 are in any way unsure about the use of the attributes above (C< join
318 >, C< select >, C< as > and C< group_by >).
319
320 =head2 Subqueries
321
322 You can write subqueries relatively easily in DBIC.
323
324   my $inside_rs = $schema->resultset('Artist')->search({
325     name => [ 'Billy Joel', 'Brittany Spears' ],
326   });
327
328   my $rs = $schema->resultset('CD')->search({
329     artist_id => { 'IN' => $inside_rs->get_column('id')->as_query },
330   });
331
332 The usual operators ( =, !=, IN, NOT IN, etc.) are supported.
333
334 B<NOTE>: You have to explicitly use '=' when doing an equality comparison.
335 The following will B<not> work:
336
337   my $rs = $schema->resultset('CD')->search({
338     artist_id => $inside_rs->get_column('id')->as_query,  # does NOT work
339   });
340
341 =head3 Support
342
343 Subqueries are supported in the where clause (first hashref), and in the
344 from, select, and +select attributes.
345
346 =head3 Correlated subqueries
347
348   my $cdrs = $schema->resultset('CD');
349   my $rs = $cdrs->search({
350     year => {
351       '=' => $cdrs->search(
352         { artist_id => { '=' => { -ident => 'me.artist_id' } } },
353         { alias => 'inner' }
354       )->get_column('year')->max_rs->as_query,
355     },
356   });
357
358 That creates the following SQL:
359
360   SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
361     FROM cd me
362    WHERE year = (
363       SELECT MAX(inner.year)
364         FROM cd inner
365        WHERE artist_id = me.artist_id
366       )
367
368 =head2 Predefined searches
369
370 You can define frequently used searches as methods by subclassing
371 L<DBIx::Class::ResultSet>:
372
373   package My::DBIC::ResultSet::CD;
374   use strict;
375   use warnings;
376   use base 'DBIx::Class::ResultSet';
377
378   sub search_cds_ordered {
379       my ($self) = @_;
380
381       return $self->search(
382           {},
383           { order_by => 'name DESC' },
384       );
385   }
386
387   1;
388
389 If you're using L<DBIx::Class::Schema/load_namespaces>, simply place the file
390 into the C<ResultSet> directory next to your C<Result> directory, and it will
391 be automatically loaded.
392
393 If however you are still using L<DBIx::Class::Schema/load_classes>, first tell
394 DBIx::Class to create an instance of the ResultSet class for you, in your
395 My::DBIC::Schema::CD class:
396
397   # class definition as normal
398   use base 'DBIx::Class::Core';
399   __PACKAGE__->table('cd');
400
401   # tell DBIC to use the custom ResultSet class
402   __PACKAGE__->resultset_class('My::DBIC::ResultSet::CD');
403
404 Note that C<resultset_class> must be called after C<load_components> and C<table>, or you will get errors about missing methods.
405
406 Then call your new method in your code:
407
408    my $ordered_cds = $schema->resultset('CD')->search_cds_ordered();
409
410 =head2 Using SQL functions on the left hand side of a comparison
411
412 Using SQL functions on the left hand side of a comparison is generally not a
413 good idea since it requires a scan of the entire table. (Unless your RDBMS
414 supports indexes on expressions - including return values of functions - and
415 you create an index on the return value of the function in question.) However,
416 it can be accomplished with C<DBIx::Class> when necessary.
417
418 Your approach for doing so will depend on whether you have turned
419 quoting on via the C<quote_char> and C<name_sep> attributes. If you
420 explicitly defined C<quote_char> and C<name_sep> in your
421 C<connect_info> (see L<DBIx::Class::Storage::DBI/"connect_info">) then
422 you are using quoting, otherwise not.
423
424 If you do not have quoting on, simply include the function in your search
425 specification as you would any column:
426
427   $rs->search({ 'YEAR(date_of_birth)' => 1979 });
428
429 With quoting on, or for a more portable solution, use literal SQL values with
430 placeholders:
431
432   $rs->search(\[ 'YEAR(date_of_birth) = ?', [ plain_value => 1979 ] ]);
433
434   # Equivalent SQL:
435   # SELECT * FROM employee WHERE YEAR(date_of_birth) = ?
436
437   $rs->search({
438     name => 'Bob',
439     -nest => \[ 'YEAR(date_of_birth) = ?', [ plain_value => 1979 ] ],
440   });
441
442   # Equivalent SQL:
443   # SELECT * FROM employee WHERE name = ? AND YEAR(date_of_birth) = ?
444
445 Note: the C<plain_value> string in the C<< [ plain_value => 1979 ] >> part
446 should be either the same as the name of the column (do this if the type of the
447 return value of the function is the same as the type of the column) or
448 otherwise it's essentially a dummy string currently (use C<plain_value> as a
449 habit). It is used by L<DBIx::Class> to handle special column types.
450
451 See also L<SQL::Abstract/Literal SQL with placeholders and bind values
452 (subqueries)>.
453
454 =head1 JOINS AND PREFETCHING
455
456 =head2 Using joins and prefetch
457
458 You can use the C<join> attribute to allow searching on, or sorting your
459 results by, one or more columns in a related table.
460
461 This requires that you have defined the L<DBIx::Class::Relationship>. For example :
462
463   My::Schema::CD->has_many( artists => 'My::Schema::Artist', 'artist_id');
464
465 To return all CDs matching a particular artist name, you specify the name of the relationship ('artists'):
466
467   my $rs = $schema->resultset('CD')->search(
468     {
469       'artists.name' => 'Bob Marley'
470     },
471     {
472       join => 'artists', # join the artist table
473     }
474   );
475
476   # Equivalent SQL:
477   # SELECT cd.* FROM cd
478   # JOIN artist ON cd.artist = artist.id
479   # WHERE artist.name = 'Bob Marley'
480
481 In that example both the join, and the condition use the relationship name rather than the table name
482 (see L<DBIx::Class::Manual::Joining> for more details on aliasing ).
483
484 If required, you can now sort on any column in the related tables by including
485 it in your C<order_by> attribute, (again using the aliased relation name rather than table name) :
486
487   my $rs = $schema->resultset('CD')->search(
488     {
489       'artists.name' => 'Bob Marley'
490     },
491     {
492       join     => 'artists',
493       order_by => [qw/ artists.name /]
494     }
495   );
496
497   # Equivalent SQL:
498   # SELECT cd.* FROM cd
499   # JOIN artist ON cd.artist = artist.id
500   # WHERE artist.name = 'Bob Marley'
501   # ORDER BY artist.name
502
503 Note that the C<join> attribute should only be used when you need to search or
504 sort using columns in a related table. Joining related tables when you only
505 need columns from the main table will make performance worse!
506
507 Now let's say you want to display a list of CDs, each with the name of the
508 artist. The following will work fine:
509
510   while (my $cd = $rs->next) {
511     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
512   }
513
514 There is a problem however. We have searched both the C<cd> and C<artist> tables
515 in our main query, but we have only returned data from the C<cd> table. To get
516 the artist name for any of the CD objects returned, L<DBIx::Class> will go back
517 to the database:
518
519   SELECT artist.* FROM artist WHERE artist.id = ?
520
521 A statement like the one above will run for each and every CD returned by our
522 main query. Five CDs, five extra queries. A hundred CDs, one hundred extra
523 queries!
524
525 Thankfully, L<DBIx::Class> has a C<prefetch> attribute to solve this problem.
526 This allows you to fetch results from related tables in advance:
527
528   my $rs = $schema->resultset('CD')->search(
529     {
530       'artists.name' => 'Bob Marley'
531     },
532     {
533       join     => 'artists',
534       order_by => [qw/ artists.name /],
535       prefetch => 'artists' # return artist data too!
536     }
537   );
538
539   # Equivalent SQL (note SELECT from both "cd" and "artist"):
540   # SELECT cd.*, artist.* FROM cd
541   # JOIN artist ON cd.artist = artist.id
542   # WHERE artist.name = 'Bob Marley'
543   # ORDER BY artist.name
544
545 The code to print the CD list remains the same:
546
547   while (my $cd = $rs->next) {
548     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
549   }
550
551 L<DBIx::Class> has now prefetched all matching data from the C<artist> table,
552 so no additional SQL statements are executed. You now have a much more
553 efficient query.
554
555 Also note that C<prefetch> should only be used when you know you will
556 definitely use data from a related table. Pre-fetching related tables when you
557 only need columns from the main table will make performance worse!
558
559 =head2 Multiple joins
560
561 In the examples above, the C<join> attribute was a scalar.  If you
562 pass an array reference instead, you can join to multiple tables.  In
563 this example, we want to limit the search further, using
564 C<LinerNotes>:
565
566   # Relationships defined elsewhere:
567   # CD->belongs_to('artist' => 'Artist');
568   # CD->has_one('liner_notes' => 'LinerNotes', 'cd');
569   my $rs = $schema->resultset('CD')->search(
570     {
571       'artist.name' => 'Bob Marley'
572       'liner_notes.notes' => { 'like', '%some text%' },
573     },
574     {
575       join     => [qw/ artist liner_notes /],
576       order_by => [qw/ artist.name /],
577     }
578   );
579
580   # Equivalent SQL:
581   # SELECT cd.*, artist.*, liner_notes.* FROM cd
582   # JOIN artist ON cd.artist = artist.id
583   # JOIN liner_notes ON cd.id = liner_notes.cd
584   # WHERE artist.name = 'Bob Marley'
585   # ORDER BY artist.name
586
587 =head2 Multi-step joins
588
589 Sometimes you want to join more than one relationship deep. In this example,
590 we want to find all C<Artist> objects who have C<CD>s whose C<LinerNotes>
591 contain a specific string:
592
593   # Relationships defined elsewhere:
594   # Artist->has_many('cds' => 'CD', 'artist');
595   # CD->has_one('liner_notes' => 'LinerNotes', 'cd');
596
597   my $rs = $schema->resultset('Artist')->search(
598     {
599       'liner_notes.notes' => { 'like', '%some text%' },
600     },
601     {
602       join => {
603         'cds' => 'liner_notes'
604       }
605     }
606   );
607
608   # Equivalent SQL:
609   # SELECT artist.* FROM artist
610   # LEFT JOIN cd ON artist.id = cd.artist
611   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
612   # WHERE liner_notes.notes LIKE '%some text%'
613
614 Joins can be nested to an arbitrary level. So if we decide later that we
615 want to reduce the number of Artists returned based on who wrote the liner
616 notes:
617
618   # Relationship defined elsewhere:
619   # LinerNotes->belongs_to('author' => 'Person');
620
621   my $rs = $schema->resultset('Artist')->search(
622     {
623       'liner_notes.notes' => { 'like', '%some text%' },
624       'author.name' => 'A. Writer'
625     },
626     {
627       join => {
628         'cds' => {
629           'liner_notes' => 'author'
630         }
631       }
632     }
633   );
634
635   # Equivalent SQL:
636   # SELECT artist.* FROM artist
637   # LEFT JOIN cd ON artist.id = cd.artist
638   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
639   # LEFT JOIN author ON author.id = liner_notes.author
640   # WHERE liner_notes.notes LIKE '%some text%'
641   # AND author.name = 'A. Writer'
642
643 =head2 Multi-step and multiple joins
644
645 With various combinations of array and hash references, you can join
646 tables in any combination you desire.  For example, to join Artist to
647 CD and Concert, and join CD to LinerNotes:
648
649   # Relationships defined elsewhere:
650   # Artist->has_many('concerts' => 'Concert', 'artist');
651
652   my $rs = $schema->resultset('Artist')->search(
653     { },
654     {
655       join => [
656         {
657           cds => 'liner_notes'
658         },
659         'concerts'
660       ],
661     }
662   );
663
664   # Equivalent SQL:
665   # SELECT artist.* FROM artist
666   # LEFT JOIN cd ON artist.id = cd.artist
667   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
668   # LEFT JOIN concert ON artist.id = concert.artist
669
670 =head2 Multi-step prefetch
671
672 C<prefetch> can be nested more than one relationship
673 deep using the same syntax as a multi-step join:
674
675   my $rs = $schema->resultset('Tag')->search(
676     {},
677     {
678       prefetch => {
679         cd => 'artist'
680       }
681     }
682   );
683
684   # Equivalent SQL:
685   # SELECT tag.*, cd.*, artist.* FROM tag
686   # JOIN cd ON tag.cd = cd.id
687   # JOIN artist ON cd.artist = artist.id
688
689 Now accessing our C<cd> and C<artist> relationships does not need additional
690 SQL statements:
691
692   my $tag = $rs->first;
693   print $tag->cd->artist->name;
694
695 =head1 ROW-LEVEL OPERATIONS
696
697 =head2 Retrieving a row object's Schema
698
699 It is possible to get a Schema object from a row object like so:
700
701   my $schema = $cd->result_source->schema;
702   # use the schema as normal:
703   my $artist_rs = $schema->resultset('Artist');
704
705 This can be useful when you don't want to pass around a Schema object to every
706 method.
707
708 =head2 Getting the value of the primary key for the last database insert
709
710 AKA getting last_insert_id
711
712 Thanks to the core component PK::Auto, this is straightforward:
713
714   my $foo = $rs->create(\%blah);
715   # do more stuff
716   my $id = $foo->id; # foo->my_primary_key_field will also work.
717
718 If you are not using autoincrementing primary keys, this will probably
719 not work, but then you already know the value of the last primary key anyway.
720
721 =head2 Stringification
722
723 Employ the standard stringification technique by using the L<overload>
724 module.
725
726 To make an object stringify itself as a single column, use something
727 like this (replace C<name> with the column/method of your choice):
728
729   use overload '""' => sub { shift->name}, fallback => 1;
730
731 For more complex stringification, you can use an anonymous subroutine:
732
733   use overload '""' => sub { $_[0]->name . ", " .
734                              $_[0]->address }, fallback => 1;
735
736 =head3 Stringification Example
737
738 Suppose we have two tables: C<Product> and C<Category>. The table
739 specifications are:
740
741   Product(id, Description, category)
742   Category(id, Description)
743
744 C<category> is a foreign key into the Category table.
745
746 If you have a Product object C<$obj> and write something like
747
748   print $obj->category
749
750 things will not work as expected.
751
752 To obtain, for example, the category description, you should add this
753 method to the class defining the Category table:
754
755   use overload "" => sub {
756       my $self = shift;
757
758       return $self->Description;
759   }, fallback => 1;
760
761 =head2 Want to know if find_or_create found or created a row?
762
763 Just use C<find_or_new> instead, then check C<in_storage>:
764
765   my $obj = $rs->find_or_new({ blah => 'blarg' });
766   unless ($obj->in_storage) {
767     $obj->insert;
768     # do whatever else you wanted if it was a new row
769   }
770
771 =head2 Static sub-classing DBIx::Class result classes
772
773 AKA adding additional relationships/methods/etc. to a model for a
774 specific usage of the (shared) model.
775
776 B<Schema definition>
777
778     package My::App::Schema;
779
780     use base 'DBIx::Class::Schema';
781
782     # load subclassed classes from My::App::Schema::Result/ResultSet
783     __PACKAGE__->load_namespaces;
784
785     # load classes from shared model
786     load_classes({
787         'My::Shared::Model::Result' => [qw/
788             Foo
789             Bar
790         /]});
791
792     1;
793
794 B<Result-Subclass definition>
795
796     package My::App::Schema::Result::Baz;
797
798     use strict;
799     use warnings;
800     use base 'My::Shared::Model::Result::Baz';
801
802     # WARNING: Make sure you call table() again in your subclass,
803     # otherwise DBIx::Class::ResultSourceProxy::Table will not be called
804     # and the class name is not correctly registered as a source
805     __PACKAGE__->table('baz');
806
807     sub additional_method {
808         return "I'm an additional method only needed by this app";
809     }
810
811     1;
812
813 =head2 Dynamic Sub-classing DBIx::Class proxy classes
814
815 AKA multi-class object inflation from one table
816
817 L<DBIx::Class> classes are proxy classes, therefore some different
818 techniques need to be employed for more than basic subclassing.  In
819 this example we have a single user table that carries a boolean bit
820 for admin.  We would like like to give the admin users
821 objects (L<DBIx::Class::Row>) the same methods as a regular user but
822 also special admin only methods.  It doesn't make sense to create two
823 separate proxy-class files for this.  We would be copying all the user
824 methods into the Admin class.  There is a cleaner way to accomplish
825 this.
826
827 Overriding the C<inflate_result> method within the User proxy-class
828 gives us the effect we want.  This method is called by
829 L<DBIx::Class::ResultSet> when inflating a result from storage.  So we
830 grab the object being returned, inspect the values we are looking for,
831 bless it if it's an admin object, and then return it.  See the example
832 below:
833
834 B<Schema Definition>
835
836     package My::Schema;
837
838     use base qw/DBIx::Class::Schema/;
839
840     __PACKAGE__->load_namespaces;
841
842     1;
843
844
845 B<Proxy-Class definitions>
846
847     package My::Schema::Result::User;
848
849     use strict;
850     use warnings;
851     use base qw/DBIx::Class::Core/;
852
853     ### Define what our admin class is, for ensure_class_loaded()
854     my $admin_class = __PACKAGE__ . '::Admin';
855
856     __PACKAGE__->table('users');
857
858     __PACKAGE__->add_columns(qw/user_id   email    password
859                                 firstname lastname active
860                                 admin/);
861
862     __PACKAGE__->set_primary_key('user_id');
863
864     sub inflate_result {
865         my $self = shift;
866         my $ret = $self->next::method(@_);
867         if( $ret->admin ) {### If this is an admin, rebless for extra functions
868             $self->ensure_class_loaded( $admin_class );
869             bless $ret, $admin_class;
870         }
871         return $ret;
872     }
873
874     sub hello {
875         print "I am a regular user.\n";
876         return ;
877     }
878
879     1;
880
881
882     package My::Schema::Result::User::Admin;
883
884     use strict;
885     use warnings;
886     use base qw/My::Schema::Result::User/;
887
888     # This line is important
889     __PACKAGE__->table('users');
890
891     sub hello
892     {
893         print "I am an admin.\n";
894         return;
895     }
896
897     sub do_admin_stuff
898     {
899         print "I am doing admin stuff\n";
900         return ;
901     }
902
903     1;
904
905 B<Test File> test.pl
906
907     use warnings;
908     use strict;
909     use My::Schema;
910
911     my $user_data = { email    => 'someguy@place.com',
912                       password => 'pass1',
913                       admin    => 0 };
914
915     my $admin_data = { email    => 'someadmin@adminplace.com',
916                        password => 'pass2',
917                        admin    => 1 };
918
919     my $schema = My::Schema->connection('dbi:Pg:dbname=test');
920
921     $schema->resultset('User')->create( $user_data );
922     $schema->resultset('User')->create( $admin_data );
923
924     ### Now we search for them
925     my $user = $schema->resultset('User')->single( $user_data );
926     my $admin = $schema->resultset('User')->single( $admin_data );
927
928     print ref $user, "\n";
929     print ref $admin, "\n";
930
931     print $user->password , "\n"; # pass1
932     print $admin->password , "\n";# pass2; inherited from User
933     print $user->hello , "\n";# I am a regular user.
934     print $admin->hello, "\n";# I am an admin.
935
936     ### The statement below will NOT print
937     print "I can do admin stuff\n" if $user->can('do_admin_stuff');
938     ### The statement below will print
939     print "I can do admin stuff\n" if $admin->can('do_admin_stuff');
940
941 Alternatively you can use L<DBIx::Class::DynamicSubclass> that implements
942 exactly the above functionality.
943
944 =head2 Skip row object creation for faster results
945
946 DBIx::Class is not built for speed, it's built for convenience and
947 ease of use, but sometimes you just need to get the data, and skip the
948 fancy objects.
949
950 To do this simply use L<DBIx::Class::ResultClass::HashRefInflator>.
951
952  my $rs = $schema->resultset('CD');
953
954  $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
955
956  my $hash_ref = $rs->find(1);
957
958 Wasn't that easy?
959
960 Beware, changing the Result class using
961 L<DBIx::Class::ResultSet/result_class> will replace any existing class
962 completely including any special components loaded using
963 load_components, eg L<DBIx::Class::InflateColumn::DateTime>.
964
965 =head2 Get raw data for blindingly fast results
966
967 If the L<HashRefInflator|DBIx::Class::ResultClass::HashRefInflator> solution
968 above is not fast enough for you, you can use a DBIx::Class to return values
969 exactly as they come out of the database with none of the convenience methods
970 wrapped round them.
971
972 This is used like so:
973
974   my $cursor = $rs->cursor
975   while (my @vals = $cursor->next) {
976       # use $val[0..n] here
977   }
978
979 You will need to map the array offsets to particular columns (you can
980 use the L<DBIx::Class::ResultSet/select> attribute of L<DBIx::Class::ResultSet/search> to force ordering).
981
982 =head1 RESULTSET OPERATIONS
983
984 =head2 Getting Schema from a ResultSet
985
986 To get the L<DBIx::Class::Schema> object from a ResultSet, do the following:
987
988  $rs->result_source->schema
989
990 =head2 Getting Columns Of Data
991
992 AKA Aggregating Data
993
994 If you want to find the sum of a particular column there are several
995 ways, the obvious one is to use search:
996
997   my $rs = $schema->resultset('Items')->search(
998     {},
999     {
1000        select => [ { sum => 'Cost' } ],
1001        as     => [ 'total_cost' ], # remember this 'as' is for DBIx::Class::ResultSet not SQL
1002     }
1003   );
1004   my $tc = $rs->first->get_column('total_cost');
1005
1006 Or, you can use the L<DBIx::Class::ResultSetColumn>, which gets
1007 returned when you ask the C<ResultSet> for a column using
1008 C<get_column>:
1009
1010   my $cost = $schema->resultset('Items')->get_column('Cost');
1011   my $tc = $cost->sum;
1012
1013 With this you can also do:
1014
1015   my $minvalue = $cost->min;
1016   my $maxvalue = $cost->max;
1017
1018 Or just iterate through the values of this column only:
1019
1020   while ( my $c = $cost->next ) {
1021     print $c;
1022   }
1023
1024   foreach my $c ($cost->all) {
1025     print $c;
1026   }
1027
1028 C<ResultSetColumn> only has a limited number of built-in functions. If
1029 you need one that it doesn't have, then you can use the C<func> method
1030 instead:
1031
1032   my $avg = $cost->func('AVERAGE');
1033
1034 This will cause the following SQL statement to be run:
1035
1036   SELECT AVERAGE(Cost) FROM Items me
1037
1038 Which will of course only work if your database supports this function.
1039 See L<DBIx::Class::ResultSetColumn> for more documentation.
1040
1041 =head2 Creating a result set from a set of rows
1042
1043 Sometimes you have a (set of) row objects that you want to put into a
1044 resultset without the need to hit the DB again. You can do that by using the
1045 L<set_cache|DBIx::Class::Resultset/set_cache> method:
1046
1047  my @uploadable_groups;
1048  while (my $group = $groups->next) {
1049    if ($group->can_upload($self)) {
1050      push @uploadable_groups, $group;
1051    }
1052  }
1053  my $new_rs = $self->result_source->resultset;
1054  $new_rs->set_cache(\@uploadable_groups);
1055  return $new_rs;
1056
1057
1058 =head1 USING RELATIONSHIPS
1059
1060 =head2 Create a new row in a related table
1061
1062   my $author = $book->create_related('author', { name => 'Fred'});
1063
1064 =head2 Search in a related table
1065
1066 Only searches for books named 'Titanic' by the author in $author.
1067
1068   my $books_rs = $author->search_related('books', { name => 'Titanic' });
1069
1070 =head2 Delete data in a related table
1071
1072 Deletes only the book named Titanic by the author in $author.
1073
1074   $author->delete_related('books', { name => 'Titanic' });
1075
1076 =head2 Ordering a relationship result set
1077
1078 If you always want a relation to be ordered, you can specify this when you
1079 create the relationship.
1080
1081 To order C<< $book->pages >> by descending page_number, create the relation
1082 as follows:
1083
1084   __PACKAGE__->has_many('pages' => 'Page', 'book', { order_by => { -desc => 'page_number'} } );
1085
1086 =head2 Filtering a relationship result set
1087
1088 If you want to get a filtered result set, you can just add add to $attr as follows:
1089
1090  __PACKAGE__->has_many('pages' => 'Page', 'book', { where => { scrap => 0 } } );
1091
1092 =head2 Many-to-many relationships
1093
1094 This is straightforward using L<ManyToMany|DBIx::Class::Relationship/many_to_many>:
1095
1096   package My::User;
1097   use base 'DBIx::Class::Core';
1098   __PACKAGE__->table('user');
1099   __PACKAGE__->add_columns(qw/id name/);
1100   __PACKAGE__->set_primary_key('id');
1101   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'user');
1102   __PACKAGE__->many_to_many('addresses' => 'user_address', 'address');
1103
1104   package My::UserAddress;
1105   use base 'DBIx::Class::Core';
1106   __PACKAGE__->table('user_address');
1107   __PACKAGE__->add_columns(qw/user address/);
1108   __PACKAGE__->set_primary_key(qw/user address/);
1109   __PACKAGE__->belongs_to('user' => 'My::User');
1110   __PACKAGE__->belongs_to('address' => 'My::Address');
1111
1112   package My::Address;
1113   use base 'DBIx::Class::Core';
1114   __PACKAGE__->table('address');
1115   __PACKAGE__->add_columns(qw/id street town area_code country/);
1116   __PACKAGE__->set_primary_key('id');
1117   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'address');
1118   __PACKAGE__->many_to_many('users' => 'user_address', 'user');
1119
1120   $rs = $user->addresses(); # get all addresses for a user
1121   $rs = $address->users(); # get all users for an address
1122
1123   my $address = $user->add_to_addresses(    # returns a My::Address instance,
1124                                             # NOT a My::UserAddress instance!
1125     {
1126       country => 'United Kingdom',
1127       area_code => 'XYZ',
1128       town => 'London',
1129       street => 'Sesame',
1130     }
1131   );
1132
1133 =head2 Relationships across DB schemas
1134
1135 Mapping relationships across L<DB schemas|DBIx::Class::Manual::Glossary/DB schema>
1136 is easy as long as the schemas themselves are all accessible via the same DBI
1137 connection. In most cases, this means that they are on the same database host
1138 as each other and your connecting database user has the proper permissions to them.
1139
1140 To accomplish this one only needs to specify the DB schema name in the table
1141 declaration, like so...
1142
1143   package MyDatabase::Main::Artist;
1144   use base qw/DBIx::Class::Core/;
1145
1146   __PACKAGE__->table('database1.artist'); # will use "database1.artist" in FROM clause
1147
1148   __PACKAGE__->add_columns(qw/ artist_id name /);
1149   __PACKAGE__->set_primary_key('artist_id');
1150   __PACKAGE__->has_many('cds' => 'MyDatabase::Main::Cd');
1151
1152   1;
1153
1154 Whatever string you specify there will be used to build the "FROM" clause in SQL
1155 queries.
1156
1157 The big drawback to this is you now have DB schema names hardcoded in your
1158 class files. This becomes especially troublesome if you have multiple instances
1159 of your application to support a change lifecycle (e.g. DEV, TEST, PROD) and
1160 the DB schemas are named based on the environment (e.g. database1_dev).
1161
1162 However, one can dynamically "map" to the proper DB schema by overriding the
1163 L<connection|DBIx::Class::Schama/connection> method in your Schema class and
1164 building a renaming facility, like so:
1165
1166   package MyDatabase::Schema;
1167   use Moose;
1168
1169   extends 'DBIx::Class::Schema';
1170
1171   around connection => sub {
1172     my ( $inner, $self, $dsn, $username, $pass, $attr ) = ( shift, @_ );
1173
1174     my $postfix = delete $attr->{schema_name_postfix};
1175
1176     $inner->(@_);
1177
1178     if ( $postfix ) {
1179         $self->append_db_name($postfix);
1180     }
1181   };
1182
1183   sub append_db_name {
1184     my ( $self, $postfix ) = @_;
1185
1186     my @sources_with_db
1187         = grep
1188             { $_->name =~ /^\w+\./mx }
1189             map
1190                 { $self->source($_) }
1191                 $self->sources;
1192
1193     foreach my $source (@sources_with_db) {
1194         my $name = $source->name;
1195         $name =~ s{^(\w+)\.}{${1}${postfix}\.}mx;
1196
1197         $source->name($name);
1198     }
1199   }
1200
1201   1;
1202
1203 By overridding the L<connection|DBIx::Class::Schama/connection>
1204 method and extracting a custom option from the provided \%attr hashref one can
1205 then simply iterate over all the Schema's ResultSources, renaming them as
1206 needed.
1207
1208 To use this facility, simply add or modify the \%attr hashref that is passed to
1209 L<connection|DBIx::Class::Schama/connect>, as follows:
1210
1211   my $schema
1212     = MyDatabase::Schema->connect(
1213       $dsn,
1214       $user,
1215       $pass,
1216       {
1217         schema_name_postfix => '_dev'
1218         # ... Other options as desired ...
1219       })
1220
1221 Obviously, one could accomplish even more advanced mapping via a hash map or a
1222 callback routine.
1223
1224 =head1 TRANSACTIONS
1225
1226 =head2 Transactions with txn_do
1227
1228 As of version 0.04001, there is improved transaction support in
1229 L<DBIx::Class::Storage> and L<DBIx::Class::Schema>.  Here is an
1230 example of the recommended way to use it:
1231
1232   my $genus = $schema->resultset('Genus')->find(12);
1233
1234   my $coderef2 = sub {
1235     $genus->extinct(1);
1236     $genus->update;
1237   };
1238
1239   my $coderef1 = sub {
1240     $genus->add_to_species({ name => 'troglodyte' });
1241     $genus->wings(2);
1242     $genus->update;
1243     $schema->txn_do($coderef2); # Can have a nested transaction. Only the outer will actualy commit
1244     return $genus->species;
1245   };
1246
1247   use Try::Tiny;
1248   my $rs;
1249   try {
1250     $rs = $schema->txn_do($coderef1);
1251   } catch {
1252     # Transaction failed
1253     die "the sky is falling!"           #
1254       if ($_ =~ /Rollback failed/);     # Rollback failed
1255
1256     deal_with_failed_transaction();
1257   };
1258
1259 Note: by default C<txn_do> will re-run the coderef one more time if an
1260 error occurs due to client disconnection (e.g. the server is bounced).
1261 You need to make sure that your coderef can be invoked multiple times
1262 without terrible side effects.
1263
1264 Nested transactions will work as expected. That is, only the outermost
1265 transaction will actually issue a commit to the $dbh, and a rollback
1266 at any level of any transaction will cause the entire nested
1267 transaction to fail.
1268
1269 =head2 Nested transactions and auto-savepoints
1270
1271 If savepoints are supported by your RDBMS, it is possible to achieve true
1272 nested transactions with minimal effort. To enable auto-savepoints via nested
1273 transactions, supply the C<< auto_savepoint = 1 >> connection attribute.
1274
1275 Here is an example of true nested transactions. In the example, we start a big
1276 task which will create several rows. Generation of data for each row is a
1277 fragile operation and might fail. If we fail creating something, depending on
1278 the type of failure, we want to abort the whole task, or only skip the failed
1279 row.
1280
1281   my $schema = MySchema->connect("dbi:Pg:dbname=my_db");
1282
1283   # Start a transaction. Every database change from here on will only be
1284   # committed into the database if the try block succeeds.
1285   use Try::Tiny;
1286   my $exception;
1287   try {
1288     $schema->txn_do(sub {
1289       # SQL: BEGIN WORK;
1290
1291       my $job = $schema->resultset('Job')->create({ name=> 'big job' });
1292       # SQL: INSERT INTO job ( name) VALUES ( 'big job' );
1293
1294       for (1..10) {
1295
1296         # Start a nested transaction, which in fact sets a savepoint.
1297         try {
1298           $schema->txn_do(sub {
1299             # SQL: SAVEPOINT savepoint_0;
1300
1301             my $thing = $schema->resultset('Thing')->create({ job=>$job->id });
1302             # SQL: INSERT INTO thing ( job) VALUES ( 1 );
1303
1304             if (rand > 0.8) {
1305               # This will generate an error, thus setting $@
1306
1307               $thing->update({force_fail=>'foo'});
1308               # SQL: UPDATE thing SET force_fail = 'foo'
1309               #      WHERE ( id = 42 );
1310             }
1311           });
1312         } catch {
1313           # SQL: ROLLBACK TO SAVEPOINT savepoint_0;
1314
1315           # There was an error while creating a $thing. Depending on the error
1316           # we want to abort the whole transaction, or only rollback the
1317           # changes related to the creation of this $thing
1318
1319           # Abort the whole job
1320           if ($_ =~ /horrible_problem/) {
1321             print "something horrible happend, aborting job!";
1322             die $_;                # rethrow error
1323           }
1324
1325           # Ignore this $thing, report the error, and continue with the
1326           # next $thing
1327           print "Cannot create thing: $_";
1328         }
1329         # There was no error, so save all changes since the last
1330         # savepoint.
1331
1332         # SQL: RELEASE SAVEPOINT savepoint_0;
1333       }
1334     });
1335   } catch {
1336     $exception = $_;
1337   }
1338
1339   if ($caught) {
1340     # There was an error while handling the $job. Rollback all changes
1341     # since the transaction started, including the already committed
1342     # ('released') savepoints. There will be neither a new $job nor any
1343     # $thing entry in the database.
1344
1345     # SQL: ROLLBACK;
1346
1347     print "ERROR: $exception\n";
1348   }
1349   else {
1350     # There was no error while handling the $job. Commit all changes.
1351     # Only now other connections can see the newly created $job and
1352     # @things.
1353
1354     # SQL: COMMIT;
1355
1356     print "Ok\n";
1357   }
1358
1359 In this example it might be hard to see where the rollbacks, releases and
1360 commits are happening, but it works just the same as for plain L<<txn_do>>: If
1361 the C<try>-block around C<txn_do> fails, a rollback is issued. If the C<try>
1362 succeeds, the transaction is committed (or the savepoint released).
1363
1364 While you can get more fine-grained control using C<svp_begin>, C<svp_release>
1365 and C<svp_rollback>, it is strongly recommended to use C<txn_do> with coderefs.
1366
1367 =head2 Simple Transactions with DBIx::Class::Storage::TxnScopeGuard
1368
1369 An easy way to use transactions is with
1370 L<DBIx::Class::Storage::TxnScopeGuard>. See L</Automatically creating
1371 related objects> for an example.
1372
1373 Note that unlike txn_do, TxnScopeGuard will only make sure the connection is
1374 alive when issuing the C<BEGIN> statement. It will not (and really can not)
1375 retry if the server goes away mid-operations, unlike C<txn_do>.
1376
1377 =head1 SQL
1378
1379 =head2 Creating Schemas From An Existing Database
1380
1381 L<DBIx::Class::Schema::Loader> will connect to a database and create a
1382 L<DBIx::Class::Schema> and associated sources by examining the database.
1383
1384 The recommend way of achieving this is to use the
1385 L<make_schema_at|DBIx::Class::Schema::Loader/make_schema_at> method:
1386
1387   perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib \
1388     -e 'make_schema_at("My::Schema", { debug => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
1389
1390 This will create a tree of files rooted at C<./lib/My/Schema/> containing
1391 source definitions for all the tables found in the C<foo> database.
1392
1393 =head2 Creating DDL SQL
1394
1395 The following functionality requires you to have L<SQL::Translator>
1396 (also known as "SQL Fairy") installed.
1397
1398 To create a set of database-specific .sql files for the above schema:
1399
1400  my $schema = My::Schema->connect($dsn);
1401  $schema->create_ddl_dir(['MySQL', 'SQLite', 'PostgreSQL'],
1402                         '0.1',
1403                         './dbscriptdir/'
1404                         );
1405
1406 By default this will create schema files in the current directory, for
1407 MySQL, SQLite and PostgreSQL, using the $VERSION from your Schema.pm.
1408
1409 To create a new database using the schema:
1410
1411  my $schema = My::Schema->connect($dsn);
1412  $schema->deploy({ add_drop_table => 1});
1413
1414 To import created .sql files using the mysql client:
1415
1416   mysql -h "host" -D "database" -u "user" -p < My_Schema_1.0_MySQL.sql
1417
1418 To create C<ALTER TABLE> conversion scripts to update a database to a
1419 newer version of your schema at a later point, first set a new
1420 C<$VERSION> in your Schema file, then:
1421
1422  my $schema = My::Schema->connect($dsn);
1423  $schema->create_ddl_dir(['MySQL', 'SQLite', 'PostgreSQL'],
1424                          '0.2',
1425                          '/dbscriptdir/',
1426                          '0.1'
1427                          );
1428
1429 This will produce new database-specific .sql files for the new version
1430 of the schema, plus scripts to convert from version 0.1 to 0.2. This
1431 requires that the files for 0.1 as created above are available in the
1432 given directory to diff against.
1433
1434 =head2 Select from dual
1435
1436 Dummy tables are needed by some databases to allow calling functions
1437 or expressions that aren't based on table content, for examples of how
1438 this applies to various database types, see:
1439 L<http://troels.arvin.dk/db/rdbms/#other-dummy_table>.
1440
1441 Note: If you're using Oracles dual table don't B<ever> do anything
1442 other than a select, if you CRUD on your dual table you *will* break
1443 your database.
1444
1445 Make a table class as you would for any other table
1446
1447   package MyAppDB::Dual;
1448   use strict;
1449   use warnings;
1450   use base 'DBIx::Class::Core';
1451   __PACKAGE__->table("Dual");
1452   __PACKAGE__->add_columns(
1453     "dummy",
1454     { data_type => "VARCHAR2", is_nullable => 0, size => 1 },
1455   );
1456
1457 Once you've loaded your table class select from it using C<select>
1458 and C<as> instead of C<columns>
1459
1460   my $rs = $schema->resultset('Dual')->search(undef,
1461     { select => [ 'sydate' ],
1462       as     => [ 'now' ]
1463     },
1464   );
1465
1466 All you have to do now is be careful how you access your resultset, the below
1467 will not work because there is no column called 'now' in the Dual table class
1468
1469   while (my $dual = $rs->next) {
1470     print $dual->now."\n";
1471   }
1472   # Can't locate object method "now" via package "MyAppDB::Dual" at headshot.pl line 23.
1473
1474 You could of course use 'dummy' in C<as> instead of 'now', or C<add_columns> to
1475 your Dual class for whatever you wanted to select from dual, but that's just
1476 silly, instead use C<get_column>
1477
1478   while (my $dual = $rs->next) {
1479     print $dual->get_column('now')."\n";
1480   }
1481
1482 Or use C<cursor>
1483
1484   my $cursor = $rs->cursor;
1485   while (my @vals = $cursor->next) {
1486     print $vals[0]."\n";
1487   }
1488
1489 In case you're going to use this "trick" together with L<DBIx::Class::Schema/deploy> or
1490 L<DBIx::Class::Schema/create_ddl_dir> a table called "dual" will be created in your
1491 current schema. This would overlap "sys.dual" and you could not fetch "sysdate" or
1492 "sequence.nextval" anymore from dual. To avoid this problem, just tell
1493 L<SQL::Translator> to not create table dual:
1494
1495     my $sqlt_args = {
1496         add_drop_table => 1,
1497         parser_args    => { sources => [ grep $_ ne 'Dual', schema->sources ] },
1498     };
1499     $schema->create_ddl_dir( [qw/Oracle/], undef, './sql', undef, $sqlt_args );
1500
1501 Or use L<DBIx::Class::ResultClass::HashRefInflator>
1502
1503   $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1504   while ( my $dual = $rs->next ) {
1505     print $dual->{now}."\n";
1506   }
1507
1508 Here are some example C<select> conditions to illustrate the different syntax
1509 you could use for doing stuff like
1510 C<oracles.heavily(nested(functions_can('take', 'lots'), OF), 'args')>
1511
1512   # get a sequence value
1513   select => [ 'A_SEQ.nextval' ],
1514
1515   # get create table sql
1516   select => [ { 'dbms_metadata.get_ddl' => [ "'TABLE'", "'ARTIST'" ]} ],
1517
1518   # get a random num between 0 and 100
1519   select => [ { "trunc" => [ { "dbms_random.value" => [0,100] } ]} ],
1520
1521   # what year is it?
1522   select => [ { 'extract' => [ \'year from sysdate' ] } ],
1523
1524   # do some math
1525   select => [ {'round' => [{'cos' => [ \'180 * 3.14159265359/180' ]}]}],
1526
1527   # which day of the week were you born on?
1528   select => [{'to_char' => [{'to_date' => [ "'25-DEC-1980'", "'dd-mon-yyyy'" ]}, "'day'"]}],
1529
1530   # select 16 rows from dual
1531   select   => [ "'hello'" ],
1532   as       => [ 'world' ],
1533   group_by => [ 'cube( 1, 2, 3, 4 )' ],
1534
1535
1536
1537 =head2 Adding Indexes And Functions To Your SQL
1538
1539 Often you will want indexes on columns on your table to speed up searching. To
1540 do this, create a method called C<sqlt_deploy_hook> in the relevant source
1541 class (refer to the advanced
1542 L<callback system|DBIx::Class::ResultSource/sqlt_deploy_callback> if you wish
1543 to share a hook between multiple sources):
1544
1545  package My::Schema::Result::Artist;
1546
1547  __PACKAGE__->table('artist');
1548  __PACKAGE__->add_columns(id => { ... }, name => { ... })
1549
1550  sub sqlt_deploy_hook {
1551    my ($self, $sqlt_table) = @_;
1552
1553    $sqlt_table->add_index(name => 'idx_name', fields => ['name']);
1554  }
1555
1556  1;
1557
1558 Sometimes you might want to change the index depending on the type of the
1559 database for which SQL is being generated:
1560
1561   my ($db_type = $sqlt_table->schema->translator->producer_type)
1562     =~ s/^SQL::Translator::Producer:://;
1563
1564 You can also add hooks to the schema level to stop certain tables being
1565 created:
1566
1567  package My::Schema;
1568
1569  ...
1570
1571  sub sqlt_deploy_hook {
1572    my ($self, $sqlt_schema) = @_;
1573
1574    $sqlt_schema->drop_table('table_name');
1575  }
1576
1577 You could also add views, procedures or triggers to the output using
1578 L<SQL::Translator::Schema/add_view>,
1579 L<SQL::Translator::Schema/add_procedure> or
1580 L<SQL::Translator::Schema/add_trigger>.
1581
1582
1583 =head2 Schema versioning
1584
1585 The following example shows simplistically how you might use DBIx::Class to
1586 deploy versioned schemas to your customers. The basic process is as follows:
1587
1588 =over 4
1589
1590 =item 1.
1591
1592 Create a DBIx::Class schema
1593
1594 =item 2.
1595
1596 Save the schema
1597
1598 =item 3.
1599
1600 Deploy to customers
1601
1602 =item 4.
1603
1604 Modify schema to change functionality
1605
1606 =item 5.
1607
1608 Deploy update to customers
1609
1610 =back
1611
1612 B<Create a DBIx::Class schema>
1613
1614 This can either be done manually, or generated from an existing database as
1615 described under L</Creating Schemas From An Existing Database>
1616
1617 B<Save the schema>
1618
1619 Call L<DBIx::Class::Schema/create_ddl_dir> as above under L</Creating DDL SQL>.
1620
1621 B<Deploy to customers>
1622
1623 There are several ways you could deploy your schema. These are probably
1624 beyond the scope of this recipe, but might include:
1625
1626 =over 4
1627
1628 =item 1.
1629
1630 Require customer to apply manually using their RDBMS.
1631
1632 =item 2.
1633
1634 Package along with your app, making database dump/schema update/tests
1635 all part of your install.
1636
1637 =back
1638
1639 B<Modify the schema to change functionality>
1640
1641 As your application evolves, it may be necessary to modify your schema
1642 to change functionality. Once the changes are made to your schema in
1643 DBIx::Class, export the modified schema and the conversion scripts as
1644 in L</Creating DDL SQL>.
1645
1646 B<Deploy update to customers>
1647
1648 Add the L<DBIx::Class::Schema::Versioned> schema component to your
1649 Schema class. This will add a new table to your database called
1650 C<dbix_class_schema_vesion> which will keep track of which version is installed
1651 and warn if the user tries to run a newer schema version than the
1652 database thinks it has.
1653
1654 Alternatively, you can send the conversion SQL scripts to your
1655 customers as above.
1656
1657 =head2 Setting quoting for the generated SQL
1658
1659 If the database contains column names with spaces and/or reserved words, they
1660 need to be quoted in the SQL queries. This is done using:
1661
1662  $schema->storage->sql_maker->quote_char([ qw/[ ]/] );
1663  $schema->storage->sql_maker->name_sep('.');
1664
1665 The first sets the quote characters. Either a pair of matching
1666 brackets, or a C<"> or C<'>:
1667
1668  $schema->storage->sql_maker->quote_char('"');
1669
1670 Check the documentation of your database for the correct quote
1671 characters to use. C<name_sep> needs to be set to allow the SQL
1672 generator to put the quotes the correct place, and defaults to
1673 C<.> if not supplied.
1674
1675 In most cases you should set these as part of the arguments passed to
1676 L<DBIx::Class::Schema/connect>:
1677
1678  my $schema = My::Schema->connect(
1679   'dbi:mysql:my_db',
1680   'db_user',
1681   'db_password',
1682   {
1683     quote_char => '"',
1684     name_sep   => '.'
1685   }
1686  )
1687
1688 In some cases, quoting will be required for all users of a schema. To enforce
1689 this, you can also overload the C<connection> method for your schema class:
1690
1691  sub connection {
1692      my $self = shift;
1693      my $rv = $self->next::method( @_ );
1694      $rv->storage->sql_maker->quote_char([ qw/[ ]/ ]);
1695      $rv->storage->sql_maker->name_sep('.');
1696      return $rv;
1697  }
1698
1699 =head2 Working with PostgreSQL array types
1700
1701 You can also assign values to PostgreSQL array columns by passing array
1702 references in the C<\%columns> (C<\%vals>) hashref of the
1703 L<DBIx::Class::ResultSet/create> and L<DBIx::Class::Row/update> family of
1704 methods:
1705
1706   $resultset->create({
1707     numbers => [1, 2, 3]
1708   });
1709
1710   $row->update(
1711     {
1712       numbers => [1, 2, 3]
1713     },
1714     {
1715       day => '2008-11-24'
1716     }
1717   );
1718
1719 In conditions (e.g. C<\%cond> in the L<DBIx::Class::ResultSet/search> family of
1720 methods) you cannot directly use array references (since this is interpreted as
1721 a list of values to be C<OR>ed), but you can use the following syntax to force
1722 passing them as bind values:
1723
1724   $resultset->search(
1725     {
1726       numbers => \[ '= ?', [numbers => [1, 2, 3]] ]
1727     }
1728   );
1729
1730 See L<SQL::Abstract/array_datatypes> and L<SQL::Abstract/Literal SQL with
1731 placeholders and bind values (subqueries)> for more explanation. Note that
1732 L<DBIx::Class> sets L<SQL::Abstract/bindtype> to C<columns>, so you must pass
1733 the bind values (the C<[1, 2, 3]> arrayref in the above example) wrapped in
1734 arrayrefs together with the column name, like this:
1735 C<< [column_name => value] >>.
1736
1737 =head2 Formatting DateTime objects in queries
1738
1739 To ensure C<WHERE> conditions containing L<DateTime> arguments are properly
1740 formatted to be understood by your RDBMS, you must use the C<DateTime>
1741 formatter returned by L<DBIx::Class::Storage::DBI/datetime_parser> to format
1742 any L<DateTime> objects you pass to L<search|DBIx::Class::ResultSet/search>
1743 conditions. Any L<Storage|DBIx::Class::Storage> object attached to your
1744 L<Schema|DBIx::Class::Schema> provides a correct C<DateTime> formatter, so
1745 all you have to do is:
1746
1747   my $dtf = $schema->storage->datetime_parser;
1748   my $rs = $schema->resultset('users')->search(
1749     {
1750       signup_date => {
1751         -between => [
1752           $dtf->format_datetime($dt_start),
1753           $dtf->format_datetime($dt_end),
1754         ],
1755       }
1756     },
1757   );
1758
1759 Without doing this the query will contain the simple stringification of the
1760 C<DateTime> object, which almost never matches the RDBMS expectations.
1761
1762 This kludge is necessary only for conditions passed to
1763 L<DBIx::Class::ResultSet/search>, whereas
1764 L<create|DBIx::Class::ResultSet/create>,
1765 L<find|DBIx::Class::ResultSet/find>,
1766 L<DBIx::Class::Row/update> (but not L<DBIx::Class::ResultSet/update>) are all
1767 L<DBIx::Class::InflateColumn>-aware and will do the right thing when supplied
1768 an inflated C<DateTime> object.
1769
1770 =head2 Using Unicode
1771
1772 When using unicode character data there are two alternatives -
1773 either your database supports unicode characters (including setting
1774 the utf8 flag on the returned string), or you need to encode/decode
1775 data appropriately each time a string field is inserted into or
1776 retrieved from the database. It is better to avoid
1777 encoding/decoding data and to use your database's own unicode
1778 capabilities if at all possible.
1779
1780 The L<DBIx::Class::UTF8Columns> component handles storing selected
1781 unicode columns in a database that does not directly support
1782 unicode. If used with a database that does correctly handle unicode
1783 then strange and unexpected data corrupt B<will> occur.
1784
1785 The Catalyst Wiki Unicode page at
1786 L<http://wiki.catalystframework.org/wiki/tutorialsandhowtos/using_unicode>
1787 has additional information on the use of Unicode with Catalyst and
1788 DBIx::Class.
1789
1790 The following databases do correctly handle unicode data:-
1791
1792 =head3 MySQL
1793
1794 MySQL supports unicode, and will correctly flag utf8 data from the
1795 database if the C<mysql_enable_utf8> is set in the connect options.
1796
1797   my $schema = My::Schema->connection('dbi:mysql:dbname=test',
1798                                       $user, $pass,
1799                                       { mysql_enable_utf8 => 1} );
1800
1801
1802 When set, a data retrieved from a textual column type (char,
1803 varchar, etc) will have the UTF-8 flag turned on if necessary. This
1804 enables character semantics on that string. You will also need to
1805 ensure that your database / table / column is configured to use
1806 UTF8. See Chapter 10 of the mysql manual for details.
1807
1808 See L<DBD::mysql> for further details.
1809
1810 =head3 Oracle
1811
1812 Information about Oracle support for unicode can be found in
1813 L<DBD::Oracle/Unicode>.
1814
1815 =head3 PostgreSQL
1816
1817 PostgreSQL supports unicode if the character set is correctly set
1818 at database creation time. Additionally the C<pg_enable_utf8>
1819 should be set to ensure unicode data is correctly marked.
1820
1821   my $schema = My::Schema->connection('dbi:Pg:dbname=test',
1822                                       $user, $pass,
1823                                       { pg_enable_utf8 => 1} );
1824
1825 Further information can be found in L<DBD::Pg>.
1826
1827 =head3 SQLite
1828
1829 SQLite version 3 and above natively use unicode internally. To
1830 correctly mark unicode strings taken from the database, the
1831 C<sqlite_unicode> flag should be set at connect time (in versions
1832 of L<DBD::SQLite> prior to 1.27 this attribute was named
1833 C<unicode>).
1834
1835   my $schema = My::Schema->connection('dbi:SQLite:/tmp/test.db',
1836                                       '', '',
1837                                       { sqlite_unicode => 1} );
1838
1839 =head1 BOOTSTRAPPING/MIGRATING
1840
1841 =head2 Easy migration from class-based to schema-based setup
1842
1843 You want to start using the schema-based approach to L<DBIx::Class>
1844 (see L<DBIx::Class::Manual::Intro/Setting it up manually>), but have an
1845 established class-based setup with lots of existing classes that you don't
1846 want to move by hand. Try this nifty script instead:
1847
1848   use MyDB;
1849   use SQL::Translator;
1850
1851   my $schema = MyDB->schema_instance;
1852
1853   my $translator           =  SQL::Translator->new(
1854       debug                => $debug          ||  0,
1855       trace                => $trace          ||  0,
1856       no_comments          => $no_comments    ||  0,
1857       show_warnings        => $show_warnings  ||  0,
1858       add_drop_table       => $add_drop_table ||  0,
1859       validate             => $validate       ||  0,
1860       parser_args          => {
1861          'DBIx::Schema'    => $schema,
1862                               },
1863       producer_args   => {
1864           'prefix'         => 'My::Schema',
1865                          },
1866   );
1867
1868   $translator->parser('SQL::Translator::Parser::DBIx::Class');
1869   $translator->producer('SQL::Translator::Producer::DBIx::Class::File');
1870
1871   my $output = $translator->translate(@args) or die
1872           "Error: " . $translator->error;
1873
1874   print $output;
1875
1876 You could use L<Module::Find> to search for all subclasses in the MyDB::*
1877 namespace, which is currently left as an exercise for the reader.
1878
1879 =head1 OVERLOADING METHODS
1880
1881 L<DBIx::Class> uses the L<Class::C3> package, which provides for redispatch of
1882 method calls, useful for things like default values and triggers. You have to
1883 use calls to C<next::method> to overload methods. More information on using
1884 L<Class::C3> with L<DBIx::Class> can be found in
1885 L<DBIx::Class::Manual::Component>.
1886
1887 =head2 Setting default values for a row
1888
1889 It's as simple as overriding the C<new> method.  Note the use of
1890 C<next::method>.
1891
1892   sub new {
1893     my ( $class, $attrs ) = @_;
1894
1895     $attrs->{foo} = 'bar' unless defined $attrs->{foo};
1896
1897     my $new = $class->next::method($attrs);
1898
1899     return $new;
1900   }
1901
1902 For more information about C<next::method>, look in the L<Class::C3>
1903 documentation. See also L<DBIx::Class::Manual::Component> for more
1904 ways to write your own base classes to do this.
1905
1906 People looking for ways to do "triggers" with DBIx::Class are probably
1907 just looking for this.
1908
1909 =head2 Changing one field whenever another changes
1910
1911 For example, say that you have three columns, C<id>, C<number>, and
1912 C<squared>.  You would like to make changes to C<number> and have
1913 C<squared> be automagically set to the value of C<number> squared.
1914 You can accomplish this by wrapping the C<number> accessor with
1915 L<Class::Method::Modifiers>:
1916
1917   around number => sub {
1918     my ($orig, $self) = (shift, shift);
1919
1920     if (@_) {
1921       my $value = $_[0];
1922       $self->squared( $value * $value );
1923     }
1924
1925     $self->next::method(@_);
1926   }
1927
1928 Note that the hard work is done by the call to C<next::method>, which
1929 redispatches your call to store_column in the superclass(es).
1930
1931 Generally, if this is a calculation your database can easily do, try
1932 and avoid storing the calculated value, it is safer to calculate when
1933 needed, than rely on the data being in sync.
1934
1935 =head2 Automatically creating related objects
1936
1937 You might have a class C<Artist> which has many C<CD>s.  Further, you
1938 want to create a C<CD> object every time you insert an C<Artist> object.
1939 You can accomplish this by overriding C<insert> on your objects:
1940
1941   sub insert {
1942     my ( $self, @args ) = @_;
1943     $self->next::method(@args);
1944     $self->create_related ('cds', \%initial_cd_data );
1945     return $self;
1946   }
1947
1948 If you want to wrap the two inserts in a transaction (for consistency,
1949 an excellent idea), you can use the awesome
1950 L<DBIx::Class::Storage::TxnScopeGuard>:
1951
1952   sub insert {
1953     my ( $self, @args ) = @_;
1954
1955     my $guard = $self->result_source->schema->txn_scope_guard;
1956
1957     $self->next::method(@args);
1958     $self->create_related ('cds', \%initial_cd_data );
1959
1960     $guard->commit;
1961
1962     return $self
1963   }
1964
1965
1966 =head2 Wrapping/overloading a column accessor
1967
1968 B<Problem:>
1969
1970 Say you have a table "Camera" and want to associate a description
1971 with each camera. For most cameras, you'll be able to generate the description from
1972 the other columns. However, in a few special cases you may want to associate a
1973 custom description with a camera.
1974
1975 B<Solution:>
1976
1977 In your database schema, define a description field in the "Camera" table that
1978 can contain text and null values.
1979
1980 In DBIC, we'll overload the column accessor to provide a sane default if no
1981 custom description is defined. The accessor will either return or generate the
1982 description, depending on whether the field is null or not.
1983
1984 First, in your "Camera" schema class, define the description field as follows:
1985
1986   __PACKAGE__->add_columns(description => { accessor => '_description' });
1987
1988 Next, we'll define the accessor-wrapper subroutine:
1989
1990   sub description {
1991       my $self = shift;
1992
1993       # If there is an update to the column, we'll let the original accessor
1994       # deal with it.
1995       return $self->_description(@_) if @_;
1996
1997       # Fetch the column value.
1998       my $description = $self->_description;
1999
2000       # If there's something in the description field, then just return that.
2001       return $description if defined $description && length $descripton;
2002
2003       # Otherwise, generate a description.
2004       return $self->generate_description;
2005   }
2006
2007 =head1 DEBUGGING AND PROFILING
2008
2009 =head2 DBIx::Class objects with Data::Dumper
2010
2011 L<Data::Dumper> can be a very useful tool for debugging, but sometimes it can
2012 be hard to find the pertinent data in all the data it can generate.
2013 Specifically, if one naively tries to use it like so,
2014
2015   use Data::Dumper;
2016
2017   my $cd = $schema->resultset('CD')->find(1);
2018   print Dumper($cd);
2019
2020 several pages worth of data from the CD object's schema and result source will
2021 be dumped to the screen. Since usually one is only interested in a few column
2022 values of the object, this is not very helpful.
2023
2024 Luckily, it is possible to modify the data before L<Data::Dumper> outputs
2025 it. Simply define a hook that L<Data::Dumper> will call on the object before
2026 dumping it. For example,
2027
2028   package My::DB::CD;
2029
2030   sub _dumper_hook {
2031     $_[0] = bless {
2032       %{ $_[0] },
2033       result_source => undef,
2034     }, ref($_[0]);
2035   }
2036
2037   [...]
2038
2039   use Data::Dumper;
2040
2041   local $Data::Dumper::Freezer = '_dumper_hook';
2042
2043   my $cd = $schema->resultset('CD')->find(1);
2044   print Dumper($cd);
2045          # dumps $cd without its ResultSource
2046
2047 If the structure of your schema is such that there is a common base class for
2048 all your table classes, simply put a method similar to C<_dumper_hook> in the
2049 base class and set C<$Data::Dumper::Freezer> to its name and L<Data::Dumper>
2050 will automagically clean up your data before printing it. See
2051 L<Data::Dumper/EXAMPLES> for more information.
2052
2053 =head2 Profiling
2054
2055 When you enable L<DBIx::Class::Storage>'s debugging it prints the SQL
2056 executed as well as notifications of query completion and transaction
2057 begin/commit.  If you'd like to profile the SQL you can subclass the
2058 L<DBIx::Class::Storage::Statistics> class and write your own profiling
2059 mechanism:
2060
2061   package My::Profiler;
2062   use strict;
2063
2064   use base 'DBIx::Class::Storage::Statistics';
2065
2066   use Time::HiRes qw(time);
2067
2068   my $start;
2069
2070   sub query_start {
2071     my $self = shift();
2072     my $sql = shift();
2073     my @params = @_;
2074
2075     $self->print("Executing $sql: ".join(', ', @params)."\n");
2076     $start = time();
2077   }
2078
2079   sub query_end {
2080     my $self = shift();
2081     my $sql = shift();
2082     my @params = @_;
2083
2084     my $elapsed = sprintf("%0.4f", time() - $start);
2085     $self->print("Execution took $elapsed seconds.\n");
2086     $start = undef;
2087   }
2088
2089   1;
2090
2091 You can then install that class as the debugging object:
2092
2093   __PACKAGE__->storage->debugobj(new My::Profiler());
2094   __PACKAGE__->storage->debug(1);
2095
2096 A more complicated example might involve storing each execution of SQL in an
2097 array:
2098
2099   sub query_end {
2100     my $self = shift();
2101     my $sql = shift();
2102     my @params = @_;
2103
2104     my $elapsed = time() - $start;
2105     push(@{ $calls{$sql} }, {
2106         params => \@params,
2107         elapsed => $elapsed
2108     });
2109   }
2110
2111 You could then create average, high and low execution times for an SQL
2112 statement and dig down to see if certain parameters cause aberrant behavior.
2113 You might want to check out L<DBIx::Class::QueryLog> as well.
2114
2115 =head1 IMPROVING PERFORMANCE
2116
2117 =over
2118
2119 =item *
2120
2121 Install L<Class::XSAccessor> to speed up L<Class::Accessor::Grouped>.
2122
2123 =item *
2124
2125 On Perl 5.8 install L<Class::C3::XS>.
2126
2127 =item *
2128
2129 L<prefetch|DBIx::Class::ResultSet/prefetch> relationships, where possible. See
2130 L</Using joins and prefetch>.
2131
2132 =item *
2133
2134 Use L<populate|DBIx::Class::ResultSet/populate> in void context to insert data
2135 when you don't need the resulting L<DBIx::Class::Row> objects, if possible, but
2136 see the caveats.
2137
2138 When inserting many rows, for best results, populate a large number of rows at a
2139 time, but not so large that the table is locked for an unacceptably long time.
2140
2141 If using L<create|DBIx::Class::ResultSet/create> instead, use a transaction and
2142 commit every C<X> rows; where C<X> gives you the best performance without
2143 locking the table for too long.
2144
2145 =item *
2146
2147 When selecting many rows, if you don't need full-blown L<DBIx::Class::Row>
2148 objects, consider using L<DBIx::Class::ResultClass::HashRefInflator>.
2149
2150 =item *
2151
2152 See also L</STARTUP SPEED> and L</MEMORY USAGE> in this document.
2153
2154 =back
2155
2156 =head1 STARTUP SPEED
2157
2158 L<DBIx::Class|DBIx::Class> programs can have a significant startup delay
2159 as the ORM loads all the relevant classes. This section examines
2160 techniques for reducing the startup delay.
2161
2162 These tips are are listed in order of decreasing effectiveness - so the
2163 first tip, if applicable, should have the greatest effect on your
2164 application.
2165
2166 =head2 Statically Define Your Schema
2167
2168 If you are using
2169 L<DBIx::Class::Schema::Loader|DBIx::Class::Schema::Loader> to build the
2170 classes dynamically based on the database schema then there will be a
2171 significant startup delay.
2172
2173 For production use a statically defined schema (which can be generated
2174 using L<DBIx::Class::Schema::Loader|DBIx::Class::Schema::Loader> to dump
2175 the database schema once - see
2176 L<make_schema_at|DBIx::Class::Schema::Loader/make_schema_at> and
2177 L<dump_directory|DBIx::Class::Schema::Loader/dump_directory> for more
2178 details on creating static schemas from a database).
2179
2180 =head2 Move Common Startup into a Base Class
2181
2182 Typically L<DBIx::Class> result classes start off with
2183
2184     use base qw/DBIx::Class::Core/;
2185     __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
2186
2187 If this preamble is moved into a common base class:-
2188
2189     package MyDBICbase;
2190
2191     use base qw/DBIx::Class::Core/;
2192     __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
2193     1;
2194
2195 and each result class then uses this as a base:-
2196
2197     use base qw/MyDBICbase/;
2198
2199 then the load_components is only performed once, which can result in a
2200 considerable startup speedup for schemas with many classes.
2201
2202 =head2 Explicitly List Schema Result Classes
2203
2204 The schema class will normally contain
2205
2206     __PACKAGE__->load_classes();
2207
2208 to load the result classes. This will use L<Module::Find|Module::Find>
2209 to find and load the appropriate modules. Explicitly defining the
2210 classes you wish to load will remove the overhead of
2211 L<Module::Find|Module::Find> and the related directory operations:
2212
2213     __PACKAGE__->load_classes(qw/ CD Artist Track /);
2214
2215 If you are instead using the L<load_namespaces|DBIx::Class::Schema/load_namespaces>
2216 syntax to load the appropriate classes there is not a direct alternative
2217 avoiding L<Module::Find|Module::Find>.
2218
2219 =head1 MEMORY USAGE
2220
2221 =head2 Cached statements
2222
2223 L<DBIx::Class> normally caches all statements with L<< prepare_cached()|DBI/prepare_cached >>.
2224 This is normally a good idea, but if too many statements are cached, the database may use too much
2225 memory and may eventually run out and fail entirely.  If you suspect this may be the case, you may want
2226 to examine DBI's L<< CachedKids|DBI/CachedKidsCachedKids_(hash_ref) >> hash:
2227
2228     # print all currently cached prepared statements
2229     print for keys %{$schema->storage->dbh->{CachedKids}};
2230     # get a count of currently cached prepared statements
2231     my $count = scalar keys %{$schema->storage->dbh->{CachedKids}};
2232
2233 If it's appropriate, you can simply clear these statements, automatically deallocating them in the
2234 database:
2235
2236     my $kids = $schema->storage->dbh->{CachedKids};
2237     delete @{$kids}{keys %$kids} if scalar keys %$kids > 100;
2238
2239 But what you probably want is to expire unused statements and not those that are used frequently.
2240 You can accomplish this with L<Tie::Cache> or L<Tie::Cache::LRU>:
2241
2242     use Tie::Cache;
2243     use DB::Main;
2244     my $schema = DB::Main->connect($dbi_dsn, $user, $pass, {
2245         on_connect_do => sub { tie %{shift->_dbh->{CachedKids}}, 'Tie::Cache', 100 },
2246     });
2247
2248 =cut