7 # Always remember to do all digits for the version even if they're 0
8 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
9 # brain damage and presumably various other packaging systems too
11 # $VERSION declaration must stay up here, ahead of any other package
12 # declarations, as to not confuse various modules attempting to determine
13 # this ones version, whether that be s.c.o. or Module::Metadata, etc
16 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
19 package # hide from pause
27 BROKEN_FORK => ($^O eq 'MSWin32') ? 1 : 0,
29 HAS_ITHREADS => $Config{useithreads} ? 1 : 0,
31 # ::Runmode would only be loaded by DBICTest, which in turn implies t/
32 DBICTEST => eval { DBICTest::RunMode->is_author } ? 1 : 0,
34 # During 5.13 dev cycle HELEMs started to leak on copy
36 # request for all tests would force "non-leaky" illusion and vice-versa
37 defined $ENV{DBICTEST_ALL_LEAKS} ? !$ENV{DBICTEST_ALL_LEAKS}
38 # otherwise confess that this perl is busted ONLY on smokers
39 : eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006) ? 1
40 # otherwise we are good
44 ASSERT_NO_INTERNAL_WANTARRAY => $ENV{DBIC_ASSERT_NO_INTERNAL_WANTARRAY} ? 1 : 0,
49 constant->import( OLD_MRO => 1 );
53 constant->import( OLD_MRO => 0 );
59 use DBIx::Class::Optional::Dependencies;
61 use base qw/DBIx::Class::Componentised DBIx::Class::AccessorGroup/;
62 use DBIx::Class::StartupCheck;
63 use DBIx::Class::Exception;
65 __PACKAGE__->mk_group_accessors(inherited => '_skip_namespace_frames');
66 __PACKAGE__->_skip_namespace_frames('^DBIx::Class|^SQL::Abstract|^Try::Tiny|^Class::Accessor::Grouped|^Context::Preserve');
69 shift->mk_classaccessor(@_);
72 sub mk_classaccessor {
74 $self->mk_group_accessors('inherited', $_[0]);
75 $self->set_inherited(@_) if @_ > 1;
78 sub component_base_class { 'DBIx::Class' }
80 sub MODIFY_CODE_ATTRIBUTES {
81 my ($class,$code,@attrs) = @_;
82 $class->mk_classdata('__attr_cache' => {})
83 unless $class->can('__attr_cache');
84 $class->__attr_cache->{$code} = [@attrs];
90 my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
94 %{ $self->maybe::next::method || {} },
106 DBIx::Class - Extensible and flexible object <-> relational mapper.
108 =head1 WHERE TO START READING
110 See L<DBIx::Class::Manual::DocMap> for an overview of the exhaustive documentation.
111 To get the most out of DBIx::Class with the least confusion it is strongly
112 recommended to read (at the very least) the
113 L<Manuals|DBIx::Class::Manual::DocMap/Manuals> in the order presented there.
115 =head1 HOW TO GET HELP
117 Due to the complexity of its problem domain, DBIx::Class is a relatively
118 complex framework. After you start using DBIx::Class questions will inevitably
119 arise. If you are stuck with a problem or have doubts about a particular
120 approach do not hesitate to contact the community with your questions. The
121 list below is sorted by "fastest response time":
125 =item * IRC: irc.perl.org#dbix-class
128 <a href="https://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
130 =item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
132 =item * RT Bug Tracker: L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=DBIx-Class>
134 =item * Twitter: L<https://www.twitter.com/dbix_class>
136 =item * Web Site: L<http://www.dbix-class.org/>
142 For the very impatient: L<DBIx::Class::Manual::QuickStart>
144 This code in the next step can be generated automatically from an existing
145 database, see L<dbicdump> from the distribution C<DBIx-Class-Schema-Loader>.
147 =head2 Schema classes preparation
149 Create a schema class called F<MyApp/Schema.pm>:
151 package MyApp::Schema;
152 use base qw/DBIx::Class::Schema/;
154 __PACKAGE__->load_namespaces();
158 Create a result class to represent artists, who have many CDs, in
159 F<MyApp/Schema/Result/Artist.pm>:
161 See L<DBIx::Class::ResultSource> for docs on defining result classes.
163 package MyApp::Schema::Result::Artist;
164 use base qw/DBIx::Class::Core/;
166 __PACKAGE__->table('artist');
167 __PACKAGE__->add_columns(qw/ artistid name /);
168 __PACKAGE__->set_primary_key('artistid');
169 __PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');
173 A result class to represent a CD, which belongs to an artist, in
174 F<MyApp/Schema/Result/CD.pm>:
176 package MyApp::Schema::Result::CD;
177 use base qw/DBIx::Class::Core/;
179 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
180 __PACKAGE__->table('cd');
181 __PACKAGE__->add_columns(qw/ cdid artistid title year /);
182 __PACKAGE__->set_primary_key('cdid');
183 __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');
189 Then you can use these classes in your application's code:
191 # Connect to your database.
193 my $schema = MyApp::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
195 # Query for all artists and put them in an array,
196 # or retrieve them as a result set object.
197 # $schema->resultset returns a DBIx::Class::ResultSet
198 my @all_artists = $schema->resultset('Artist')->all;
199 my $all_artists_rs = $schema->resultset('Artist');
201 # Output all artists names
202 # $artist here is a DBIx::Class::Row, which has accessors
203 # for all its columns. Rows are also subclasses of your Result class.
204 foreach $artist (@all_artists) {
205 print $artist->name, "\n";
208 # Create a result set to search for artists.
209 # This does not query the DB.
210 my $johns_rs = $schema->resultset('Artist')->search(
211 # Build your WHERE using an SQL::Abstract structure:
212 { name => { like => 'John%' } }
215 # Execute a joined query to get the cds.
216 my @all_john_cds = $johns_rs->search_related('cds')->all;
218 # Fetch the next available row.
219 my $first_john = $johns_rs->next;
221 # Specify ORDER BY on the query.
222 my $first_john_cds_by_title_rs = $first_john->cds(
224 { order_by => 'title' }
227 # Create a result set that will fetch the artist data
228 # at the same time as it fetches CDs, using only one query.
229 my $millennium_cds_rs = $schema->resultset('CD')->search(
231 { prefetch => 'artist' }
234 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
235 my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
237 # new() makes a Result object but doesnt insert it into the DB.
238 # create() is the same as new() then insert().
239 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
240 $new_cd->artist($cd->artist);
241 $new_cd->insert; # Auto-increment primary key filled in after INSERT
242 $new_cd->title('Fork');
244 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
246 # change the year of all the millennium CDs at once
247 $millennium_cds_rs->update({ year => 2002 });
251 This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
252 (with a compatibility layer as a springboard for porting) and a resultset API
253 that allows abstract encapsulation of database operations. It aims to make
254 representing queries in your code as perl-ish as possible while still
255 providing access to as many of the capabilities of the database as possible,
256 including retrieving related records from multiple tables in a single query,
257 C<JOIN>, C<LEFT JOIN>, C<COUNT>, C<DISTINCT>, C<GROUP BY>, C<ORDER BY> and
260 DBIx::Class can handle multi-column primary and foreign keys, complex
261 queries and database-level paging, and does its best to only query the
262 database in order to return something you've directly asked for. If a
263 resultset is used as an iterator it only fetches rows off the statement
264 handle as requested in order to minimise memory usage. It has auto-increment
265 support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
266 known to be used in production on at least the first four, and is fork-
267 and thread-safe out of the box (although
268 L<your DBD may not be|DBI/Threads and Thread Safety>).
270 This project is still under rapid development, so large new features may be
271 marked B<experimental> - such APIs are still usable but may have edge bugs.
272 Failing test cases are I<always> welcome and point releases are put out rapidly
273 as bugs are found and fixed.
275 We do our best to maintain full backwards compatibility for published
276 APIs, since DBIx::Class is used in production in many organisations,
277 and even backwards incompatible changes to non-published APIs will be fixed
278 if they're reported and doing so doesn't cost the codebase anything.
280 The test suite is quite substantial, and several developer releases
281 are generally made to CPAN before the branch for the next release is
282 merged back to trunk for a major release.
284 =head1 HOW TO CONTRIBUTE
286 Contributions are always welcome, in all usable forms (we especially
287 welcome documentation improvements). The delivery methods include git-
288 or unified-diff formatted patches, GitHub pull requests, or plain bug
289 reports either via RT or the Mailing list. Contributors are generally
290 granted full access to the official repository after their first patch
291 passes successful review.
294 FIXME: Getty, frew and jnap need to get off their asses and finish the contrib section so we can link it here ;)
296 This project is maintained in a git repository. The code and related tools are
297 accessible at the following locations:
301 =item * Official repo: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
303 =item * Official gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
305 =item * GitHub mirror: L<https://github.com/dbsrgits/DBIx-Class>
307 =item * Authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/DBIx-Class.git>
309 =item * Travis-CI log: L<https://travis-ci.org/dbsrgits/dbix-class/builds>
312 ↪ Stable branch CI status: <img src="https://secure.travis-ci.org/dbsrgits/dbix-class.png?branch=master"></img>
318 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
320 (I mostly consider myself "project founder" these days but the AUTHOR heading
325 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
327 acca: Alexander Kuznetsov <acca@cpan.org>
329 aherzog: Adam Herzog <adam@herzogdesigns.com>
331 Alexander Keusch <cpan@keusch.at>
333 alexrj: Alessandro Ranellucci <aar@cpan.org>
335 alnewkirk: Al Newkirk <we@ana.im>
337 amiri: Amiri Barksdale <amiri@metalabel.com>
339 amoore: Andrew Moore <amoore@cpan.org>
341 andrewalker: Andre Walker <andre@andrewalker.net>
343 andyg: Andy Grundman <andy@hybridized.org>
347 arc: Aaron Crane <arc@cpan.org>
349 arcanez: Justin Hunter <justin.d.hunter@gmail.com>
351 ash: Ash Berlin <ash@cpan.org>
353 bert: Norbert Csongrádi <bert@cpan.org>
355 blblack: Brandon L. Black <blblack@gmail.com>
357 bluefeet: Aran Deltac <bluefeet@cpan.org>
359 bphillips: Brian Phillips <bphillips@cpan.org>
361 boghead: Bryan Beeley <cpan@beeley.org>
363 brd: Brad Davis <brd@FreeBSD.org>
365 bricas: Brian Cassidy <bricas@cpan.org>
367 brunov: Bruno Vecchi <vecchi.b@gmail.com>
369 caelum: Rafael Kitover <rkitover@cpan.org>
371 caldrin: Maik Hentsche <maik.hentsche@amd.com>
373 castaway: Jess Robinson
375 claco: Christopher H. Laco
379 da5id: David Jack Olrik <djo@cpan.org>
381 dariusj: Darius Jokilehto <dariusjokilehto@yahoo.co.uk>
383 davewood: David Schmidt <davewood@gmx.at>
385 daxim: Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯 <daxim@cpan.org>
387 debolaz: Anders Nor Berle <berle@cpan.org>
389 dew: Dan Thomas <dan@godders.org>
391 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
393 dnm: Justin Wheeler <jwheeler@datademons.com>
395 dpetrov: Dimitar Petrov <mitakaa@gmail.com>
397 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
399 dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
401 edenc: Eden Cardim <edencardim@gmail.com>
403 ether: Karen Etheridge <ether@cpan.org>
405 felliott: Fitz Elliott <fitz.elliott@gmail.com>
407 freetime: Bill Moseley <moseley@hank.org>
409 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
411 goraxe: Gordon Irving <goraxe@cpan.org>
413 gphat: Cory G Watson <gphat@cpan.org>
415 Grant Street Group L<http://www.grantstreet.com/>
417 groditi: Guillermo Roditi <groditi@cpan.org>
419 Haarg: Graham Knop <haarg@haarg.org>
421 hobbs: Andrew Rodland <arodland@cpan.org>
423 ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
425 initself: Mike Baas <mike@initselftech.com>
427 ironcamel: Naveed Massjouni <naveedm9@gmail.com>
429 jawnsy: Jonathan Yu <jawnsy@cpan.org>
431 jasonmay: Jason May <jason.a.may@gmail.com>
435 jgoulah: John Goulah <jgoulah@cpan.org>
437 jguenther: Justin Guenther <jguenther@cpan.org>
439 jhannah: Jay Hannah <jay@jays.net>
441 jmac: Jason McIntosh <jmac@appleseed-sc.com>
443 jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
445 jon: Jon Schutz <jjschutz@cpan.org>
447 jshirley: J. Shirley <jshirley@gmail.com>
449 kaare: Kaare Rasmussen
451 konobi: Scott McWhirter
453 littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
455 lukes: Luke Saunders <luke.saunders@gmail.com>
457 marcus: Marcus Ramberg <mramberg@cpan.org>
459 mattlaw: Matt Lawrence
461 mattp: Matt Phillips <mattp@cpan.org>
463 michaelr: Michael Reddick <michael.reddick@gmail.com>
465 milki: Jonathan Chu <milki@rescomp.berkeley.edu>
467 mithaldu: Christian Walde <walde.christian@gmail.com>
469 mjemmeson: Michael Jemmeson <michael.jemmeson@gmail.com>
471 mstratman: Mark A. Stratman <stratman@gmail.com>
473 ned: Neil de Carteret
475 nigel: Nigel Metheringham <nigelm@cpan.org>
477 ningu: David Kamholz <dkamholz@cpan.org>
479 Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
481 norbi: Norbert Buchmuller <norbi@nix.hu>
483 nuba: Nuba Princigalli <nuba@cpan.org>
485 Numa: Dan Sully <daniel@cpan.org>
487 ovid: Curtis "Ovid" Poe <ovid@cpan.org>
489 oyse: E<Oslash>ystein Torget <oystein.torget@dnv.com>
491 paulm: Paul Makepeace
493 penguin: K J Cheetham
495 perigrin: Chris Prather <chris@prather.org>
497 peter: Peter Collingbourne <peter@pcc.me.uk>
499 Peter Siklósi <einon@einon.hu>
501 Peter Valdemar ME<oslash>rch <peter@morch.com>
503 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
505 plu: Johannes Plunien <plu@cpan.org>
507 Possum: Daniel LeWarne <possum@cpan.org>
509 quicksilver: Jules Bean
511 rafl: Florian Ragwitz <rafl@debian.org>
513 rainboxx: Matthias Dietrich <perl@rb.ly>
515 rbo: Robert Bohne <rbo@cpan.org>
517 rbuels: Robert Buels <rmb32@cornell.edu>
519 rdj: Ryan D Johnson <ryan@innerfence.com>
521 ribasushi: Peter Rabbitson <ribasushi@cpan.org>
523 rjbs: Ricardo Signes <rjbs@cpan.org>
525 robkinyon: Rob Kinyon <rkinyon@cpan.org>
527 Robert Olson <bob@rdolson.org>
529 moltar: Roman Filippov <romanf@cpan.org>
531 Sadrak: Felix Antonius Wilhelm Ostmann <sadrak@cpan.org>
533 sc_: Just Another Perl Hacker
535 scotty: Scotty Allen <scotty@scottyallen.com>
537 semifor: Marc Mims <marc@questright.com>
539 SineSwiper: Brendan Byrd <bbyrd@cpan.org>
541 solomon: Jared Johnson <jaredj@nmgi.com>
543 spb: Stephen Bennett <stephen@freenode.net>
545 Squeeks <squeek@cpan.org>
547 sszabo: Stephan Szabo <sszabo@bigpanda.com>
549 talexb: Alex Beamish <talexb@gmail.com>
551 tamias: Ronald J Kimball <rjk@tamias.net>
553 teejay : Aaron Trevena <teejay@cpan.org>
559 tonvoon: Ton Voon <tonvoon@cpan.org>
561 triode: Pete Gamache <gamache@cpan.org>
563 typester: Daisuke Murase <typester@cpan.org>
565 victori: Victor Igumnov <victori@cpan.org>
569 wesm: Wes Malone <wes@mitsi.com>
571 willert: Sebastian Willert <willert@cpan.org>
573 wreis: Wallace Reis <wreis@cpan.org>
575 xenoterracide: Caleb Cushing <xenoterracide@gmail.com>
577 yrlnry: Mark Jason Dominus <mjd@plover.com>
579 zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
583 Copyright (c) 2005 - 2011 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
588 This library is free software and may be distributed under the same terms