Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
DBIx::Class::MigrationUsertContributedIPerClass::Migration::Tutorial::Setup(3)

NAME
       DBIx::Class::Migration::Tutorial::Setup - Bootstrap your	project	files

GOAL
       By the end of this section, you should be able to bootstrap a standard
       Perl project and	have a simple DBIx::Class project installed.  You
       should then be able to proceed to creating some migrations.

Bootstrap your Project
       We make minimal use of Dist::Zilla to create a basic project skeleton.
       I realize Dist::Zilla is	not everyone's favorite	tool for this purpose,
       but I am	choosing it for	the purpose of the tutorial because its	simple
       enough for my basic need.  If you know enough to	not like Dist::Zilla
       then I will assume you know enough to perform this next task using some
       other tool.

Open a shell / terminal
       Most Perl projects use commandline tools, rather	than a GUI IDE.	 You
       should open a terminal with a commandline interface of choice, change
       to a directory where you	like to	store project files (such as $HOME or
       "$HOME/Desktop")	and proceed.

Install	Dist::Zilla
	   cpanm Dist::Zilla

Create a basic Project Skeleton
	   dzil	new MusicBase
	   cd MusicBase

       You should now have a directory structure like this:

	   /MusicBase
	     dist.ini
	     /lib
	       MusicBase.pm

       We will use the "dist.ini" file to manage our project dependencies.
       Open "dist.ini" in your editor of choice	and alter it to	look like
       this:

	   name	   = MusicBase
	   author  = John Napiorkowski <jjnapiork@cpan.org>
	   license = Perl_5
	   copyright_holder = John Napiorkowski
	   copyright_year   = 2012
	   abstract = Tutorial Application for DBIx-Class-Migration

	   version = 0.001

	   [@Basic]
	   [Prereqs]
	   DBIx::Class = 0
	   DBIx::Class::Migration = 0

       Set "author" and	"copyright_holder" as suits you.

       Next open the file "lib/MusicBase.pm" in	your text editor and change it
       as follows:

	   package MusicBase;

	   our $VERSION	= '0.001';

	   1;

	   =head1 NAME

	   MusicBase - The DBIx::Class::Migration tutorial application

	   =head1 AUTHOR

	   John	Napiorkowski L<email:jjnapiork@cpan.org>

	   =head1 SEE ALSO

	   L<DBIx::Class::Migration>

	   =head1 COPYRIGHT & LICENSE

	   Copyright 2012, John	Napiorkowski L<email:jjnapiork@cpan.org>

	   This	library	is free	software; you can redistribute it and/or modify	it under
	   the same terms as Perl itself.

	   =cut

       As you can see, this is just a stub of POD to help give someone general
       context.

       Going forward, when I say 'do something in your project home
       directory', I mean inside this new "MusicBase" directory	which you just
       made.

       Congrats, you have a basic Perl project setup!  If you are using	a
       source control tool, you	should probably	commit.

Install	your dependencies
       You listed a few	dependencies in	the "dist.ini" file you	modified
       above.  Let's get those installed now:

	   dzil	listdeps | cpanm

       Managing	your project dependencies via your "dist.ini" file (or
       "Makefile.PL" if	you prefer) is considered a community approved best
       practice.

DBIx::Class Application	Version	1
       In this section you'll setup a first version of the MusicBase DBIC
       files.

       The working application we are going to design is called	MusicBase
       which is	an application that tracks what	Artists	have made what CDs and
       which Tracks are	part of	which CD.  Here's the general model:

	   -- An Artist	has zero or more Cds.
	   -- Each Cd belongs to a single Artist
	   -- Each Cd has zero or more Tracks (or songs	you can	listen to)
	   -- A	Track can belong to only one Cd.

       Additionally you	need to	store the Artists name,	and the	titles for
       both the	Cds and	the Tracks.

       You also	have some business logic that requires you to return the set
       of Artists that have more than one Cd published.	 Let's model that!

       From your application home directory (the directory that	contains your
       "dist.ini" file)	perform	the following commands:

	   mkdir lib/MusicBase
	   mkdir lib/MusicBase/Schema
	   mkdir lib/MusicBase/Schema/Result
	   mkdir lib/MusicBase/Schema/ResultSet
	   touch lib/MusicBase/Schema.pm
	   touch lib/MusicBase/Schema/Result/Artist.pm
	   touch lib/MusicBase/Schema/Result/Cd.pm
	   touch lib/MusicBase/Schema/Result/Track.pm
	   touch lib/MusicBase/Schema/ResultSet/Artist.pm

       You'll now have a standard DBIx::Class directory	structure that follows
       current good practices.	Lets add in some code to our file stubs.

       Change "lib/MusicBase/Schema.pm"	to match the following:

	   package MusicBase::Schema;

	   use strict;
	   use warnings;

	   use base 'DBIx::Class::Schema';

	   our $VERSION	= 1;

	   __PACKAGE__->load_namespaces;

	   1;

       Change "lib/MusicBase/Schema/Result/Artist.pm"

	   package MusicBase::Schema::Result::Artist;

	   use strict;
	   use warnings;

	   use base 'DBIx::Class::Core';

	   __PACKAGE__->table('artist');
	   __PACKAGE__->add_columns(
	     'artist_id' => {
	       data_type => 'integer',
	     },
	     'name' => {
	       data_type => 'varchar',
	       size => '96',
	     });

	   __PACKAGE__->set_primary_key('artist_id');
	   __PACKAGE__->has_many(
	     'cd_rs' =>	'MusicBase::Schema::Result::Cd',
	     {'foreign.artist_fk'=>'self.artist_id'});

	   1;

       Change "lib/MusicBase/Schema/Result/Cd.pm"

	   package MusicBase::Schema::Result::Cd;

	   use strict;
	   use warnings;

	   use base qw/DBIx::Class::Core/;

	   __PACKAGE__->table('cd');
	   __PACKAGE__->add_columns(
	     'cd_id' =>	{
	       data_type => 'integer',
	     },
	     'artist_fk' => {
	       data_type => 'integer',
	     },
	     'title' =>	{
	       data_type => 'varchar',
	       size => '96',
	     });

	   __PACKAGE__->set_primary_key('cd_id');

	   __PACKAGE__->belongs_to(
	     'artist' => 'MusicBase::Schema::Result::Artist',
	     {'foreign.artist_id'=>'self.artist_fk'});

	   __PACKAGE__->has_many(
	     'track_rs'	=> 'MusicBase::Schema::Result::Track',
	     {'foreign.cd_fk'=>'self.cd_id'});

	   1;

       Change "lib/MusicBase/Schema/Result/Track.pm"

	   package MusicBase::Schema::Result::Track;

	   use strict;
	   use warnings;

	   use base qw/DBIx::Class::Core/;

	   __PACKAGE__->table('track');
	   __PACKAGE__->add_columns(
	     'track_id'	=> {
	       data_type => 'integer',
	     },
	     'cd_fk' =>	{
	       data_type => 'integer',
	     },
	     'title' =>	{
	       data_type => 'varchar',
	       size => '96',
	     });

	   __PACKAGE__->set_primary_key('track_id');
	   __PACKAGE__->belongs_to(
	     'cd' => "MusicBase::Schema::Result::Cd",
	     {'foreign.cd_id'=>'self.cd_fk'});

	   1;

       Change "lib/MusicBase/Schema/ResultSet/Artist.pm"

	   package MusicBase::Schema::ResultSet::Artist;

	   use strict;
	   use warnings;

	   use base 'DBIx::Class::ResultSet';

	   sub has_more_than_one_cds {
	     my	$me = (my $self	= shift)->current_source_alias;
	     $self->search(
	       {},
	       {
		 join=>['cd_rs'],
		 '+select'=> [ { count => 'cd_rs.cd_id', -as =>	'cd_count'} ],
		 '+as'=> ['cd_count'],
		 group_by=>["$me.artist_id"],
		 having	=> { cd_count => \'> 1'	}
	       }
	     );
	   }

	   1;

       That completes creating your basic DBIx::Class structure.

Basic Test Case
       You should create a basic test case just	to make	sure you didn't	make
       any serious errors or forgot something while creating the files.

	   mkdir t
	   touch t/use.t

       Change "t/use.t"	as follows

	   #!/usr/bin/env perl

	   use Test::Most tests=>1;

	   BEGIN {
	     use_ok 'MusicBase::Schema';
	   }

       Then run	your test case.

	   prove -lv t/use.t

       You should expect the one test to pass.	If it fails, please review
       your classes since you probably introduced a typo or syntax error.

       If your tests pass, that's great	you've completed the first part	of the
       tutorial!

SUMMARY
       You did a lot of	cut and	paste this step, I promise things will be more
       interesting later on.  However, you did all the main grunt work that it
       takes to	get going on a well formed Perl	project.  At this point	you
       have a DBIC application that you'd actually be able to use.

NEXT STEPS
       Proceed to DBIx::Class::Migration::Tutorial::FirstMigration.

AUTHOR
       See DBIx::Class::Migration for author information

COPYRIGHT & LICENSE
       See DBIx::Class::Migration for copyright	and license information

perl v5.24.1			  20DBIx::Class::Migration::Tutorial::Setup(3)

NAME | GOAL | Bootstrap your Project | Open a shell / terminal | Install Dist::Zilla | Create a basic Project Skeleton | Install your dependencies | DBIx::Class Application Version 1 | Basic Test Case | SUMMARY | NEXT STEPS | AUTHOR | COPYRIGHT & LICENSE

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=DBIx::Class::Migration::Tutorial::Setup&sektion=3&manpath=FreeBSD+12.1-RELEASE+and+Ports>

home | help