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