X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FManual%2FExample.pod;h=83e96feed516a9134819d45adfcd36af219b4775;hb=372b98a6eaaca008a75f826bf75347537f4c866b;hp=195c75aa9f696f9e4f37c707480f6ac698676b3c;hpb=49e87fbb47be0bb6a8cf816bda8cad2e3f7a4b20;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Manual/Example.pod b/lib/DBIx/Class/Manual/Example.pod index 195c75a..83e96fe 100644 --- a/lib/DBIx/Class/Manual/Example.pod +++ b/lib/DBIx/Class/Manual/Example.pod @@ -11,7 +11,7 @@ as the database frontend. The database consists of the following: table 'artist' with columns: artistid, name - table 'cd' with columns: cdid, artist, title + table 'cd' with columns: cdid, artist, title, year table 'track' with columns: trackid, cd, title @@ -27,27 +27,30 @@ And these rules exists: Install DBIx::Class via CPAN should be sufficient. -=head3 Create the database/tables. +=head3 Create the database/tables First make and change the directory: mkdir app cd app + mkdir db + cd db This example uses SQLite which is a dependency of DBIx::Class, so you shouldn't have to install extra software. -Save the following into a example.sql +Save the following into a example.sql in the directory db CREATE TABLE artist ( artistid INTEGER PRIMARY KEY, - name TEXT NOT NULL + name TEXT NOT NULL ); CREATE TABLE cd ( cdid INTEGER PRIMARY KEY, artist INTEGER NOT NULL REFERENCES artist(artistid), - title TEXT NOT NULL + title TEXT NOT NULL, + year TEXT ); CREATE TABLE track ( @@ -56,82 +59,84 @@ Save the following into a example.sql title TEXT NOT NULL ); -and create the sqlite database file: +and create the SQLite database file: -sqlite3 example.db < example.sql + sqlite3 example.db < example.sql =head3 Set up DBIx::Class::Schema -First, create some dirs and change working directory: +Change directory back from db to the directory app: + + cd ../ + +Now create some more directories: - mkdir MyDatabase - mkdir MyDatabase/Main + mkdir MyApp + mkdir MyApp/Schema + mkdir MyApp/Schema/Result + mkdir MyApp/Schema/ResultSet Then, create the following DBIx::Class::Schema classes: -MyDatabase/Main.pm: - - package MyDatabase::Main; +MyApp/Schema.pm: + + package MyApp::Schema; use base qw/DBIx::Class::Schema/; - __PACKAGE__->load_classes(qw/Artist Cd Track/); + __PACKAGE__->load_namespaces; 1; -MyDatabase/Main/Artist.pm: +MyApp/Schema/Result/Artist.pm: - package MyDatabase::Main::Artist; - use base qw/DBIx::Class/; - __PACKAGE__->load_components(qw/Core/); + package MyApp::Schema::Result::Artist; + use base qw/DBIx::Class::Core/; __PACKAGE__->table('artist'); __PACKAGE__->add_columns(qw/ artistid name /); __PACKAGE__->set_primary_key('artistid'); - __PACKAGE__->has_many('cds' => 'MyDatabase::Main::Cd'); + __PACKAGE__->has_many('cds' => 'MyApp::Schema::Result::Cd'); 1; -MyDatabase/Main/Cd.pm: +MyApp/Schema/Result/Cd.pm: - package MyDatabase::Main::Cd; - use base qw/DBIx::Class/; - __PACKAGE__->load_components(qw/Core/); + package MyApp::Schema::Result::Cd; + use base qw/DBIx::Class::Core/; + __PACKAGE__->load_components(qw/InflateColumn::DateTime/); __PACKAGE__->table('cd'); - __PACKAGE__->add_columns(qw/ cdid artist title/); + __PACKAGE__->add_columns(qw/ cdid artist title year/); __PACKAGE__->set_primary_key('cdid'); - __PACKAGE__->belongs_to('artist' => 'MyDatabase::Main::Artist'); - __PACKAGE__->has_many('tracks' => 'MyDatabase::Main::Track'); + __PACKAGE__->belongs_to('artist' => 'MyApp::Schema::Result::Artist'); + __PACKAGE__->has_many('tracks' => 'MyApp::Schema::Result::Track'); 1; -MyDatabase/Main/Track.pm: +MyApp/Schema/Result/Track.pm: - package MyDatabase::Main::Track; - use base qw/DBIx::Class/; - __PACKAGE__->load_components(qw/Core/); + package MyApp::Schema::Result::Track; + use base qw/DBIx::Class::Core/; __PACKAGE__->table('track'); - __PACKAGE__->add_columns(qw/ trackid cd title/); + __PACKAGE__->add_columns(qw/ trackid cd title /); __PACKAGE__->set_primary_key('trackid'); - __PACKAGE__->belongs_to('cd' => 'MyDatabase::Main::Cd'); + __PACKAGE__->belongs_to('cd' => 'MyApp::Schema::Result::Cd'); 1; -=head3 Write a script to insert some records. +=head3 Write a script to insert some records insertdb.pl - #!/usr/bin/perl -w + #!/usr/bin/perl - use MyDatabase::Main; use strict; + use warnings; - my $schema = MyDatabase::Main->connect('dbi:SQLite:example.db'); + use MyApp::Schema; - # here's some of the sql that is going to be generated by the schema - # INSERT INTO artist VALUES (NULL,'Michael Jackson'); - # INSERT INTO artist VALUES (NULL,'Eminem'); + my $schema = MyApp::Schema->connect('dbi:SQLite:db/example.db'); my @artists = (['Michael Jackson'], ['Eminem']); $schema->populate('Artist', [ @@ -147,10 +152,10 @@ insertdb.pl my @cds; foreach my $lp (keys %albums) { - my $artist = $schema->resultset('Artist')->search({ + my $artist = $schema->resultset('Artist')->find({ name => $albums{$lp} }); - push @cds, [$lp, $artist->first]; + push @cds, [$lp, $artist->id]; } $schema->populate('Cd', [ @@ -171,10 +176,10 @@ insertdb.pl my @tracks; foreach my $track (keys %tracks) { - my $cdname = $schema->resultset('Cd')->search({ + my $cdname = $schema->resultset('Cd')->find({ title => $tracks{$track}, }); - push @tracks, [$cdname->first, $track]; + push @tracks, [$cdname->id, $track]; } $schema->populate('Track',[ @@ -182,16 +187,20 @@ insertdb.pl @tracks, ]); -=head3 Create and run the scripts +=head3 Create and run the test scripts testdb.pl: - #!/usr/bin/perl -w + #!/usr/bin/perl - use MyDatabase::Main; use strict; + use warnings; + + use MyApp::Schema; - my $schema = MyDatabase::Main->connect('dbi:SQLite:example.db'); + my $schema = MyApp::Schema->connect('dbi:SQLite:db/example.db'); + # for other DSNs, e.g. MySQL, see the perldoc for the relevant dbd + # driver, e.g perldoc L. get_tracks_by_cd('Bad'); get_tracks_by_artist('Michael Jackson'); @@ -212,7 +221,6 @@ testdb.pl: }, { join => [qw/ cd /], - prefetch => [qw/ cd /] } ); while (my $track = $rs->next) { @@ -239,8 +247,8 @@ testdb.pl: } print "\n"; } - - + + sub get_cd_by_track { my $tracktitle = shift; print "get_cd_by_track($tracktitle):\n"; @@ -255,7 +263,7 @@ testdb.pl: my $cd = $rs->first; print $cd->title . "\n\n"; } - + sub get_cds_by_artist { my $artistname = shift; print "get_cds_by_artist($artistname):\n"; @@ -265,7 +273,6 @@ testdb.pl: }, { join => [qw/ artist /], - prefetch => [qw/ artist /] } ); while (my $cd = $rs->next) { @@ -339,18 +346,34 @@ It should output: =head1 Notes +A reference implementation of the database and scripts in this example +are available in the main distribution for DBIx::Class under the +directory F. + With these scripts we're relying on @INC looking in the current -working directory. You may want to add the MyDatabase namespaces to +working directory. You may want to add the MyApp namespaces to @INC in a different way when it comes to deployment. -The testdb.pl script is an excellent start for testing your database +The F script is an excellent start for testing your database model. -=head1 TODO +This example uses L to load in the +appropriate L classes from the +C namespace, and any required +L classes from the +C namespace (although we created the directory +in the directions above we did not add, or need to add, any resultset +classes). + +=head1 FURTHER QUESTIONS? + +Check the list of L. -=head1 AUTHOR +=head1 COPYRIGHT AND LICENSE - sc_ from irc.perl.org#dbix-class - Kieren Diment +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut