rearrange tutorial and codebits
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / Manual / CatalystIntro.pod
CommitLineData
c8fc14dc 1package DBIx::Class::DeploymentHandler::Manual::CatalystIntro
2
3# ABSTRACT: Introduction to using DBIx::Class::DeploymentHandler with a new Catalyst Project
4
c8fc14dc 5=pod
6
c8fc14dc 7=head1 Background
8
adae121b 9This introduction will use PostgreSQL and L<Catalyst>. Background
10information on using PostgreSQL with Catalyst can be found at
11L<Catalyst::Manual::Tutorial::10_Appendices>. This guide will assume that
12you have some understanding of Catalyst. Please go through the Catalyst
13tutorials first if you have not yet done so.
c8fc14dc 14
15=head1 Database Setup
16
adae121b 17Start by creating a user C<catalyst>, with password C<catalyst>
c8fc14dc 18
adae121b 19 $ sudo -u postgres createuser -P catalyst
20 Enter password for new role: <catalyst>
21 Enter it again: <catalyst>
22 Shall the new role be a superuser? (y/n) n
23 Shall the new role be allowed to create databases? (y/n) n
24 Shall the new role be allowed to create more new roles? (y/n) n
c8fc14dc 25
adae121b 26Then create a new database called C<deploymentintro>
c8fc14dc 27
adae121b 28 sudo -u postgres createdb -O catalyst deploymentintro
c8fc14dc 29
30=head1 Create the project
31
adae121b 32 $ catalyst.pl DeploymentIntro
33 $ cd DeploymentIntro
34 $ perl Makefile.PL
c8fc14dc 35
36=head1 Create the Schema
37
adae121b 38 $ script/deploymentintro_create.pl model DB DBIC::Schema DeploymentIntro::Schema \
39 create=static 'dbi:Pg:dbname=deploymentintro' 'catalyst' 'catalyst' '{ AutoCommit => 1 }'
c8fc14dc 40
adae121b 41 $ mkdir -p lib/Schema/Result
c8fc14dc 42
adae121b 43Remove the following from C<lib/DeploymentIntro/Model/DB.pm>:
c8fc14dc 44
adae121b 45 connect_info => {
46 dsn => 'dbi:Pg:dbname=deploymentintro',
47 user => 'catalyst',
48 password => 'catalyst',
49 AutoCommit => q{1},
50 }
c8fc14dc 51
adae121b 52Remove C<deploymentintro.conf> and create a new file called
53C<deploymentintro_local.pl> with the following:
c8fc14dc 54
55 {
56 name => "DeploymentIntro",
57
58 "Model::DB" => {
59 schema_class => 'DeploymentIntro::Schema',
60
61 connect_info => {
62 dsn => 'dbi:Pg:dbname=deploymentintro',
63 user => 'catalyst',
64 password => 'catalyst',
adae121b 65 AutoCommit => 1,
c8fc14dc 66 }
67 }
68 }
69
adae121b 70Copy the following program into scripts, under the name
71C<deploymentintro_dbicdh.pl>
c8fc14dc 72
adae121b 73 #!/usr/bin/env perl
c8fc14dc 74
adae121b 75 use strict;
76 use warnings;
c8fc14dc 77
adae121b 78 use feature ":5.10";
c8fc14dc 79
adae121b 80 use aliased 'DBIx::Class::DeploymentHandler' => 'DH';
81 use FindBin;
82 use lib "$FindBin::Bin/../lib";
83 use DeploymentIntro::Schema;
84 use Config::JFDI;
c8fc14dc 85
adae121b 86 my $config = Config::JFDI->new( name => 'DeploymentIntro' );
87 my $config_hash = $config->get;
88 my $connect_info = $config_hash->{"Model::DB"}{"connect_info"};
89 my $schema = DeploymentIntro::Schema->connect($connect_info);
c8fc14dc 90
adae121b 91 my $dh = DH->new({
92 schema => $schema,
93 script_directory => "$FindBin::Bin/../dbicdh",
94 databases => 'PostgreSQL',
95 });
c8fc14dc 96
adae121b 97 sub install {
98 $dh->prepare_install;
99 $dh->install;
100 }
c8fc14dc 101
adae121b 102 sub upgrade {
103 die "Please set the version in Schema.pm"
104 unless $dh->schema->schema_version;
105 die "Please update the version in Schema.pm"
106 if ( $dh->version_storage->version_rs->search({version => $dh->schema_version})->count );
107 die "We only support positive integers for versions around these parts."
108 unless $dh->schema_version =~ /^\d+$/;
109
110 $dh->prepare_deploy;
111 $dh->prepare_upgrade;
112 $dh->upgrade;
113 }
114
115 sub current_version {
116 say $dh->database_version;
117 }
118
119 sub help {
120 say <<'OUT';
121 usage:
122 install
123 upgrade
124 current-version
125 OUT
126 }
127
128 help unless $ARGV[0];
129
130 given ( $ARGV[0] ) {
131 when ('install') { install() }
132 when ('upgrade') { upgrade() }
133 when ('current-version') { current_version() }
134 }
135
136Copy the following files into C<lib/DeploymentIntro/Schema/Result>:
137
138C<Cd.pm>
139
140 package DeploymentIntro::Schema::Result::Cd;
141
142 use strict;
143 use warnings;
144
145 use parent 'DBIx::Class::Core';
146
147 __PACKAGE__->load_components(qw(InflateColumn::DateTime));
148 __PACKAGE__->table('cd');
149
150 __PACKAGE__->add_columns(
151 id => {
152 data_type => 'integer',
153 is_auto_increment => 1,
154 },
155 artist_id => {
156 data_type => 'integer'
157 },
158 title => {
159 data_type => 'text'
160 },
161 );
162
163 __PACKAGE__->set_primary_key('id');
164
165 __PACKAGE__->belongs_to(
166 artist => 'DeploymentIntro::Schema::Result::Artist', 'artist_id' );
167
168 __PACKAGE__->has_many(
169 tracks => 'DeploymentIntro::Schema::Result::Track', 'cd_id' );
170
171 1;
172
173
174C<Artist.pm>
175
176 package DeploymentIntro::Schema::Result::Artist;
177
178 use strict;
179 use warnings;
180
181 use parent 'DBIx::Class::Core';
182
183 __PACKAGE__->table('artist');
184
185 __PACKAGE__->add_columns(
186 id => {
187 data_type => 'integer',
188 is_auto_increment => 1,
189 },
190 name => {
191 data_type => 'text'
192 },
193 );
c8fc14dc 194
adae121b 195 __PACKAGE__->set_primary_key('id');
c8fc14dc 196
adae121b 197 __PACKAGE__->has_many(
198 cds => 'DeploymentIntro::Schema::Result::Cd', 'artist_id' );
c8fc14dc 199
adae121b 200 1;
c8fc14dc 201
c8fc14dc 202
adae121b 203C<Track.pm>
c8fc14dc 204
adae121b 205 package DeploymentIntro::Schema::Result::Track;
c8fc14dc 206
adae121b 207 use strict;
208 use warnings;
c8fc14dc 209
adae121b 210 use parent 'DBIx::Class::Core';
c8fc14dc 211
adae121b 212 __PACKAGE__->table('track');
c8fc14dc 213
adae121b 214 __PACKAGE__->add_columns(
215 id => {
216 data_type => 'integer',
217 is_auto_increment => 1,
218 },
219 cd_id => {
220 data_type => 'integer',
221 },
222 title => {
223 data_type => 'text',
224 }
225 );
c8fc14dc 226
adae121b 227 __PACKAGE__->set_primary_key('id');
c8fc14dc 228
adae121b 229 __PACKAGE__->belongs_to(
230 cd => 'DeploymentIntro::Schema::Result::Cd', 'cd_id' );
c8fc14dc 231
adae121b 232 1;
c8fc14dc 233
c8fc14dc 234
adae121b 235And then edit C<lib/DeploymentIntro/Schema.pm> and add the following above the
2361 at the bottom
c8fc14dc 237
adae121b 238 our $VERSION = 1;
c8fc14dc 239
240Now it is just a matter of running
241
adae121b 242 ./script/deploymentintro_dbicdh.pl install
c8fc14dc 243