7 use base qw/DBIx::Class::Componentised Class::Accessor::Grouped/;
8 use DBIx::Class::StartupCheck;
12 shift->mk_classaccessor(@_);
15 sub mk_classaccessor {
17 $self->mk_group_accessors('inherited', $_[0]);
18 $self->set_inherited(@_) if @_ > 1;
21 sub component_base_class { 'DBIx::Class' }
23 # Always remember to do all digits for the version even if they're 0
24 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
25 # brain damage and presumably various other packaging systems too
27 $VERSION = '0.08099_01';
29 $VERSION = eval $VERSION; # numify for warning-free dev releases
31 sub MODIFY_CODE_ATTRIBUTES {
32 my ($class,$code,@attrs) = @_;
33 $class->mk_classdata('__attr_cache' => {})
34 unless $class->can('__attr_cache');
35 $class->__attr_cache->{$code} = [@attrs];
41 my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
42 my $rest = eval { $self->next::method };
43 return $@ ? $cache : { %$cache, %$rest };
50 DBIx::Class - Extensible and flexible object <-> relational mapper.
52 =head1 GETTING HELP/SUPPORT
54 The community can be found via:
56 Mailing list: http://lists.scsys.co.uk/mailman/listinfo/dbix-class/
58 SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
60 SVNWeb: http://dev.catalyst.perl.org/svnweb/bast/browse/DBIx-Class/
62 IRC: irc.perl.org#dbix-class
66 Create a schema class called DB/Main.pm:
69 use base qw/DBIx::Class::Schema/;
71 __PACKAGE__->load_classes();
75 Create a table class to represent artists, who have many CDs, in DB/Main/Artist.pm:
77 package DB::Main::Artist;
78 use base qw/DBIx::Class/;
80 __PACKAGE__->load_components(qw/PK::Auto Core/);
81 __PACKAGE__->table('artist');
82 __PACKAGE__->add_columns(qw/ artistid name /);
83 __PACKAGE__->set_primary_key('artistid');
84 __PACKAGE__->has_many(cds => 'DB::Main::CD');
88 A table class to represent a CD, which belongs to an artist, in DB/Main/CD.pm:
91 use base qw/DBIx::Class/;
93 __PACKAGE__->load_components(qw/PK::Auto Core/);
94 __PACKAGE__->table('cd');
95 __PACKAGE__->add_columns(qw/ cdid artist title year /);
96 __PACKAGE__->set_primary_key('cdid');
97 __PACKAGE__->belongs_to(artist => 'DB::Main::Artist');
101 Then you can use these classes in your application's code:
103 # Connect to your database.
105 my $schema = DB::Main->connect($dbi_dsn, $user, $pass, \%dbi_params);
107 # Query for all artists and put them in an array,
108 # or retrieve them as a result set object.
109 my @all_artists = $schema->resultset('Artist')->all;
110 my $all_artists_rs = $schema->resultset('Artist');
112 # Create a result set to search for artists.
113 # This does not query the DB.
114 my $johns_rs = $schema->resultset('Artist')->search(
115 # Build your WHERE using an SQL::Abstract structure:
116 { name => { like => 'John%' } }
119 # Execute a joined query to get the cds.
120 my @all_john_cds = $johns_rs->search_related('cds')->all;
122 # Fetch only the next row.
123 my $first_john = $johns_rs->next;
125 # Specify ORDER BY on the query.
126 my $first_john_cds_by_title_rs = $first_john->cds(
128 { order_by => 'title' }
131 # Create a result set that will fetch the artist relationship
132 # at the same time as it fetches CDs, using only one query.
133 my $millennium_cds_rs = $schema->resultset('CD')->search(
135 { prefetch => 'artist' }
138 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
139 my $cd_artist_name = $cd->artist->name; # Already has the data so no query
141 # new() makes a DBIx::Class::Row object but doesnt insert it into the DB.
142 # create() is the same as new() then insert().
143 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
144 $new_cd->artist($cd->artist);
145 $new_cd->insert; # Auto-increment primary key filled in after INSERT
146 $new_cd->title('Fork');
148 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
150 $millennium_cds_rs->update({ year => 2002 }); # Single-query bulk update
154 This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
155 (and a compatibility layer as a springboard for porting) and a resultset API
156 that allows abstract encapsulation of database operations. It aims to make
157 representing queries in your code as perl-ish as possible while still
158 providing access to as many of the capabilities of the database as possible,
159 including retrieving related records from multiple tables in a single query,
160 JOIN, LEFT JOIN, COUNT, DISTINCT, GROUP BY and HAVING support.
162 DBIx::Class can handle multi-column primary and foreign keys, complex
163 queries and database-level paging, and does its best to only query the
164 database in order to return something you've directly asked for. If a
165 resultset is used as an iterator it only fetches rows off the statement
166 handle as requested in order to minimise memory usage. It has auto-increment
167 support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
168 known to be used in production on at least the first four, and is fork-
169 and thread-safe out of the box (although your DBD may not be).
171 This project is still under rapid development, so large new features may be
172 marked EXPERIMENTAL - such APIs are still usable but may have edge bugs.
173 Failing test cases are *always* welcome and point releases are put out rapidly
174 as bugs are found and fixed.
176 We do our best to maintain full backwards compatibility for published
177 APIs, since DBIx::Class is used in production in many organisations,
178 and even backwards incompatible changes to non-published APIs will be fixed
179 if they're reported and doing so doesn't cost the codebase anything.
181 The test suite is quite substantial, and several developer releases
182 are generally made to CPAN before the branch for the next release is
183 merged back to trunk for a major release.
185 =head1 WHERE TO GO NEXT
187 L<DBIx::Class::Manual::DocMap> lists each task you might want help on, and
188 the modules where you will find documentation.
192 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
194 (I mostly consider myself "project founder" these days but the AUTHOR heading
199 abraxxa: Alexander Hartmaier <alex_hartmaier@hotmail.com>
201 aherzog: Adam Herzog <adam@herzogdesigns.com>
203 andyg: Andy Grundman <andy@hybridized.org>
207 ash: Ash Berlin <ash@cpan.org>
209 bert: Norbert Csongradi <bert@cpan.org>
211 blblack: Brandon L. Black <blblack@gmail.com>
213 bluefeet: Aran Deltac <bluefeet@cpan.org>
215 captainL: Luke Saunders <luke.saunders@gmail.com>
217 castaway: Jess Robinson
219 claco: Christopher H. Laco
223 da5id: David Jack Olrik <djo@cpan.org>
225 debolaz: Anders Nor Berle <berle@cpan.org>
227 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
229 dnm: Justin Wheeler <jwheeler@datademons.com>
231 draven: Marcus Ramberg <mramberg@cpan.org>
233 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
235 dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
237 gphat: Cory G Watson <gphat@cpan.org>
241 jguenther: Justin Guenther <jguenther@cpan.org>
243 jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
245 jon: Jon Schutz <jjschutz@cpan.org>
247 jshirley: J. Shirley <jshirley@gmail.com>
249 konobi: Scott McWhirter
251 LTJake: Brian Cassidy <bricas@cpan.org>
253 mattlaw: Matt Lawrence
255 ned: Neil de Carteret
257 nigel: Nigel Metheringham <nigelm@cpan.org>
259 ningu: David Kamholz <dkamholz@cpan.org>
261 Numa: Dan Sully <daniel@cpan.org>
263 oyse: Øystein Torget <oystein.torget@dnv.com>
265 paulm: Paul Makepeace
267 penguin: K J Cheetham
269 perigrin: Chris Prather <chris@prather.org>
271 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
273 quicksilver: Jules Bean
275 rdj: Ryan D Johnson <ryan@innerfence.com>
277 sc_: Just Another Perl Hacker
279 scotty: Scotty Allen <scotty@scottyallen.com>
281 semifor: Marc Mims <marc@questright.com>
283 sszabo: Stephan Szabo <sszabo@bigpanda.com>
285 teejay : Aaron Trevena <teejay@cpan.org>
291 typester: Daisuke Murase <typester@cpan.org>
293 victori: Victor Igumnov <victori@cpan.org>
297 willert: Sebastian Willert <willert@cpan.org>
299 zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
303 You may distribute this code under the same terms as Perl itself.