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