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