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 || {} },
100 DBIx::Class - Extensible and flexible object <-> relational mapper.
102 =head1 GETTING HELP/SUPPORT
104 The community can be found via:
108 =item * IRC: irc.perl.org#dbix-class
111 <a href="http://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
113 =item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
115 =item * Twitter L<http://www.twitter.com/dbix_class>
117 =item * Web Site: L<http://www.dbix-class.org/>
119 =item * RT Bug Tracker: L<https://rt.cpan.org/Dist/Display.html?Queue=DBIx-Class>
123 The project is maintained in a git repository, accessible from the following sources:
127 =item * git: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
129 =item * gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
131 =item * github mirror: L<https://github.com/dbsrgits/DBIx-Class>
133 =item * authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/DBIx-Class.git>
135 =item * Travis-CI log: L<http://travis-ci.org/dbsrgits/dbix-class/builds>
138 <img src="https://secure.travis-ci.org/dbsrgits/dbix-class.png?branch=master"></img>
144 Create a schema class called MyApp/Schema.pm:
146 package MyApp::Schema;
147 use base qw/DBIx::Class::Schema/;
149 __PACKAGE__->load_namespaces();
153 Create a result class to represent artists, who have many CDs, in
154 MyApp/Schema/Result/Artist.pm:
156 See L<DBIx::Class::ResultSource> for docs on defining result classes.
158 package MyApp::Schema::Result::Artist;
159 use base qw/DBIx::Class::Core/;
161 __PACKAGE__->table('artist');
162 __PACKAGE__->add_columns(qw/ artistid name /);
163 __PACKAGE__->set_primary_key('artistid');
164 __PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');
168 A result class to represent a CD, which belongs to an artist, in
169 MyApp/Schema/Result/CD.pm:
171 package MyApp::Schema::Result::CD;
172 use base qw/DBIx::Class::Core/;
174 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
175 __PACKAGE__->table('cd');
176 __PACKAGE__->add_columns(qw/ cdid artistid title year /);
177 __PACKAGE__->set_primary_key('cdid');
178 __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');
182 Then you can use these classes in your application's code:
184 # Connect to your database.
186 my $schema = MyApp::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
188 # Query for all artists and put them in an array,
189 # or retrieve them as a result set object.
190 # $schema->resultset returns a DBIx::Class::ResultSet
191 my @all_artists = $schema->resultset('Artist')->all;
192 my $all_artists_rs = $schema->resultset('Artist');
194 # Output all artists names
195 # $artist here is a DBIx::Class::Row, which has accessors
196 # for all its columns. Rows are also subclasses of your Result class.
197 foreach $artist (@all_artists) {
198 print $artist->name, "\n";
201 # Create a result set to search for artists.
202 # This does not query the DB.
203 my $johns_rs = $schema->resultset('Artist')->search(
204 # Build your WHERE using an SQL::Abstract structure:
205 { name => { like => 'John%' } }
208 # Execute a joined query to get the cds.
209 my @all_john_cds = $johns_rs->search_related('cds')->all;
211 # Fetch the next available row.
212 my $first_john = $johns_rs->next;
214 # Specify ORDER BY on the query.
215 my $first_john_cds_by_title_rs = $first_john->cds(
217 { order_by => 'title' }
220 # Create a result set that will fetch the artist data
221 # at the same time as it fetches CDs, using only one query.
222 my $millennium_cds_rs = $schema->resultset('CD')->search(
224 { prefetch => 'artist' }
227 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
228 my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
230 # new() makes a Result object but doesnt insert it into the DB.
231 # create() is the same as new() then insert().
232 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
233 $new_cd->artist($cd->artist);
234 $new_cd->insert; # Auto-increment primary key filled in after INSERT
235 $new_cd->title('Fork');
237 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
239 # change the year of all the millennium CDs at once
240 $millennium_cds_rs->update({ year => 2002 });
244 This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
245 (with a compatibility layer as a springboard for porting) and a resultset API
246 that allows abstract encapsulation of database operations. It aims to make
247 representing queries in your code as perl-ish as possible while still
248 providing access to as many of the capabilities of the database as possible,
249 including retrieving related records from multiple tables in a single query,
250 JOIN, LEFT JOIN, COUNT, DISTINCT, GROUP BY, ORDER BY and HAVING support.
252 DBIx::Class can handle multi-column primary and foreign keys, complex
253 queries and database-level paging, and does its best to only query the
254 database in order to return something you've directly asked for. If a
255 resultset is used as an iterator it only fetches rows off the statement
256 handle as requested in order to minimise memory usage. It has auto-increment
257 support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
258 known to be used in production on at least the first four, and is fork-
259 and thread-safe out of the box (although
260 L<your DBD may not be|DBI/Threads and Thread Safety>).
262 This project is still under rapid development, so large new features may be
263 marked EXPERIMENTAL - such APIs are still usable but may have edge bugs.
264 Failing test cases are *always* welcome and point releases are put out rapidly
265 as bugs are found and fixed.
267 We do our best to maintain full backwards compatibility for published
268 APIs, since DBIx::Class is used in production in many organisations,
269 and even backwards incompatible changes to non-published APIs will be fixed
270 if they're reported and doing so doesn't cost the codebase anything.
272 The test suite is quite substantial, and several developer releases
273 are generally made to CPAN before the branch for the next release is
274 merged back to trunk for a major release.
276 =head1 WHERE TO GO NEXT
278 L<DBIx::Class::Manual::DocMap> lists each task you might want help on, and
279 the modules where you will find documentation.
283 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
285 (I mostly consider myself "project founder" these days but the AUTHOR heading
290 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
292 acca: Alexander Kuznetsov <acca@cpan.org>
294 aherzog: Adam Herzog <adam@herzogdesigns.com>
296 Alexander Keusch <cpan@keusch.at>
298 alexrj: Alessandro Ranellucci <aar@cpan.org>
300 alnewkirk: Al Newkirk <we@ana.im>
302 amiri: Amiri Barksdale <amiri@metalabel.com>
304 amoore: Andrew Moore <amoore@cpan.org>
306 andrewalker: Andre Walker <andre@andrewalker.net>
308 andyg: Andy Grundman <andy@hybridized.org>
312 arc: Aaron Crane <arc@cpan.org>
314 arcanez: Justin Hunter <justin.d.hunter@gmail.com>
316 ash: Ash Berlin <ash@cpan.org>
318 bert: Norbert Csongradi <bert@cpan.org>
320 blblack: Brandon L. Black <blblack@gmail.com>
322 bluefeet: Aran Deltac <bluefeet@cpan.org>
324 bphillips: Brian Phillips <bphillips@cpan.org>
326 boghead: Bryan Beeley <cpan@beeley.org>
328 brd: Brad Davis <brd@FreeBSD.org>
330 bricas: Brian Cassidy <bricas@cpan.org>
332 brunov: Bruno Vecchi <vecchi.b@gmail.com>
334 caelum: Rafael Kitover <rkitover@cpan.org>
336 caldrin: Maik Hentsche <maik.hentsche@amd.com>
338 castaway: Jess Robinson
340 claco: Christopher H. Laco
344 da5id: David Jack Olrik <djo@cpan.org>
346 davewood: David Schmidt <davewood@gmx.at>
348 debolaz: Anders Nor Berle <berle@cpan.org>
350 dew: Dan Thomas <dan@godders.org>
352 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
354 dnm: Justin Wheeler <jwheeler@datademons.com>
356 dpetrov: Dimitar Petrov <mitakaa@gmail.com>
358 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
360 dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
362 edenc: Eden Cardim <edencardim@gmail.com>
364 felliott: Fitz Elliott <fitz.elliott@gmail.com>
366 freetime: Bill Moseley <moseley@hank.org>
368 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
370 goraxe: Gordon Irving <goraxe@cpan.org>
372 gphat: Cory G Watson <gphat@cpan.org>
374 Grant Street Group L<http://www.grantstreet.com/>
376 groditi: Guillermo Roditi <groditi@cpan.org>
378 Haarg: Graham Knop <haarg@haarg.org>
380 hobbs: Andrew Rodland <arodland@cpan.org>
382 ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
384 initself: Mike Baas <mike@initselftech.com>
386 ironcamel: Naveed Massjouni <naveedm9@gmail.com>
388 jawnsy: Jonathan Yu <jawnsy@cpan.org>
390 jasonmay: Jason May <jason.a.may@gmail.com>
394 jgoulah: John Goulah <jgoulah@cpan.org>
396 jguenther: Justin Guenther <jguenther@cpan.org>
398 jhannah: Jay Hannah <jay@jays.net>
400 jmac: Jason McIntosh <jmac@appleseed-sc.com>
402 jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
404 jon: Jon Schutz <jjschutz@cpan.org>
406 jshirley: J. Shirley <jshirley@gmail.com>
408 kaare: Kaare Rasmussen
410 konobi: Scott McWhirter
412 littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
414 lukes: Luke Saunders <luke.saunders@gmail.com>
416 marcus: Marcus Ramberg <mramberg@cpan.org>
418 mattlaw: Matt Lawrence
420 mattp: Matt Phillips <mattp@cpan.org>
422 michaelr: Michael Reddick <michael.reddick@gmail.com>
424 milki: Jonathan Chu <milki@rescomp.berkeley.edu>
426 mithaldu: Christian Walde <walde.christian@gmail.com>
428 mjemmeson: Michael Jemmeson <michael.jemmeson@gmail.com>
430 mstratman: Mark A. Stratman <stratman@gmail.com>
432 ned: Neil de Carteret
434 nigel: Nigel Metheringham <nigelm@cpan.org>
436 ningu: David Kamholz <dkamholz@cpan.org>
438 Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
440 norbi: Norbert Buchmuller <norbi@nix.hu>
442 nuba: Nuba Princigalli <nuba@cpan.org>
444 Numa: Dan Sully <daniel@cpan.org>
446 ovid: Curtis "Ovid" Poe <ovid@cpan.org>
448 oyse: E<Oslash>ystein Torget <oystein.torget@dnv.com>
450 paulm: Paul Makepeace
452 penguin: K J Cheetham
454 perigrin: Chris Prather <chris@prather.org>
456 peter: Peter Collingbourne <peter@pcc.me.uk>
458 Peter Valdemar ME<oslash>rch <peter@morch.com>
460 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
462 plu: Johannes Plunien <plu@cpan.org>
464 Possum: Daniel LeWarne <possum@cpan.org>
466 quicksilver: Jules Bean
468 rafl: Florian Ragwitz <rafl@debian.org>
470 rainboxx: Matthias Dietrich <perl@rb.ly>
472 rbo: Robert Bohne <rbo@cpan.org>
474 rbuels: Robert Buels <rmb32@cornell.edu>
476 rdj: Ryan D Johnson <ryan@innerfence.com>
478 ribasushi: Peter Rabbitson <ribasushi@cpan.org>
480 rjbs: Ricardo Signes <rjbs@cpan.org>
482 robkinyon: Rob Kinyon <rkinyon@cpan.org>
484 Robert Olson <bob@rdolson.org>
486 moltar: Roman Filippov <romanf@cpan.org>
488 Sadrak: Felix Antonius Wilhelm Ostmann <sadrak@cpan.org>
490 sc_: Just Another Perl Hacker
492 scotty: Scotty Allen <scotty@scottyallen.com>
494 semifor: Marc Mims <marc@questright.com>
496 SineSwiper: Brendan Byrd <bbyrd@cpan.org>
498 solomon: Jared Johnson <jaredj@nmgi.com>
500 spb: Stephen Bennett <stephen@freenode.net>
502 Squeeks <squeek@cpan.org>
504 sszabo: Stephan Szabo <sszabo@bigpanda.com>
506 talexb: Alex Beamish <talexb@gmail.com>
508 tamias: Ronald J Kimball <rjk@tamias.net>
510 teejay : Aaron Trevena <teejay@cpan.org>
516 tonvoon: Ton Voon <tonvoon@cpan.org>
518 triode: Pete Gamache <gamache@cpan.org>
520 typester: Daisuke Murase <typester@cpan.org>
522 victori: Victor Igumnov <victori@cpan.org>
526 wesm: Wes Malone <wes@mitsi.com>
528 willert: Sebastian Willert <willert@cpan.org>
530 wreis: Wallace Reis <wreis@cpan.org>
532 xenoterracide: Caleb Cushing <xenoterracide@gmail.com>
534 yrlnry: Mark Jason Dominus <mjd@plover.com>
536 zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
540 Copyright (c) 2005 - 2011 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
545 This library is free software and may be distributed under the same terms