1 package DBIx::Class::DeploymentHandler::Manual::Intro
3 # ABSTRACT: Introduction to DBIx::Class::DeploymentHandler
7 =head1 Why is DBIx::Class::DeploymentHandler worth using?
9 The most obvious reasons for using DBIx::Class::DeploymentHandler are
10 that it can run multiple SQL scripts as well as Perl scripts, unlike
11 DBIx::Class::Schema::Versioned, which only allows for a single SQL script.
12 It is also extremely extensible, and is an opportunity for a break from
13 backwards compatibility, so some regrettable decisions are avoided.
15 =head1 Sample database
17 Follow L<DBIx::Class::Manual::Intro> except for the parts setting up the
18 database. After you are done, You should have the following files.
29 Add a line like the following in your MyDatabase::Main file:
33 or if you are using a newer Perl you can use the prettier syntax:
35 package MyDatabase::Main 1;
37 By default DBIx::Class::DeploymentHandler only uses integers for versions,
38 this makes versioning much simpler for figuring out what version is next
43 Our first script, C<install.pl> reads our schema file and creates the tables
49 use aliased 'DBIx::Class::DeploymentHandler' => 'DH';
51 use lib "$FindBin::Bin/../lib";
53 my $schema = MyDatabase::Main->connect('dbi:SQLite:mydb');
57 script_directory => "$FindBin::Bin/dbicdh",
58 databases => 'SQLite',
59 sql_translator_args => { add_drop_table => 0 },
65 =head2 dbicdh - Our migration scripts
67 Running C<install.pl> should create the following:
81 DBIx::Class::DeploymentHandler automatically generates SQL from our schema
82 that is suitable for SQLite
86 This contains all of the raw information about our schema that is then
87 translated into the sql.
91 To truly take advantage of all DBIx::Class::DeploymentHandler offers, you
92 should probably be using it for population. To do that all you need to do
93 is create a file called C<dbicdh/_common/install/1/create_artists.pl>:
97 $schema->resultset('User')->populate([
100 ['The Moutain Goats'],
107 Add a line to MyDatabase/Main/Result/Cd.pm below
109 __PACKAGE__->add_columns(qw/ cdid artist title /);
113 __PACKAGE__->add_column(isbn => { is_nullable => 1 });
115 Aside: It must be nullable or have a default - otherwise the upgrade will
116 fail for logical reasons. To be clear, if you add a column to a database and
117 it is not nullable and has no default, what will the existing rows contain
120 So here is our next script, C<upgrade.pl>:
125 use aliased 'DBIx::Class::DeploymentHandler' => 'DH';
127 use lib "$FindBin::Bin/../lib";
128 use MyDatabase::Main;
129 my $schema = MyDatabase::Main->connect('dbi:SQLite:mydb');
133 script_directory => "$FindBin::Bin/dbicdh",
134 databases => 'SQLite',
135 sql_translator_args => { add_drop_table => 0 },
139 $dh->prepare_upgrade({ from_version => 1, to_version => 2});
142 Our script directory now looks like:
148 | | | `-- 001-auto.sql
161 The new C<deploy/001-auto.sql> and C<deploy/001-auto.yml> files are the
162 state of the db as at that version. The C<upgrade/1-2/001-auto.sql> file
163 is the most interesting one; it is what gets your database from version 1 to 2.
165 And again, you can create a Perl file like we did previously with the