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