NAME

DBIx::Migration - Seamless database schema up- and downgrades

SYNOPSIS

my $m = DBIx::Migration->new(
  dsn => 'dbi:SQLite:~/Projects/myapp/db/myapp.db',
  dir => '~/Projects/myapp/db/migrations'
);

# Get current version from database
my $version = $m->version;

# Migrate database to version 1
$m->migrate( 1 );

# Migrate database to the newest/highest version
$m->migrate;

# ~/Projects/myapp/db/migrations/schema_1_up.sql
CREATE TABLE foo (
    id INTEGER PRIMARY KEY,
    bar TEXT
);

# ~/Projects/myapp/db/migrations/schema_1_down.sql
DROP TABLE foo;

# ~/Projects/myapp/db/migrations/schema_2_up.sql
CREATE TABLE bar (
    id INTEGER PRIMARY KEY,
    baz TEXT
);

# ~/Projects/myapp/db/migrations/schema_2_down.sql
DROP TABLE bar;

DESCRIPTION

This module provides seamless database schema up- and downgrades. The implementation is based on migrations. A migration is a ".sql" script. Although not mandatory the script name begins with a prefix like for example "schema_". It follows a version number that is a positive integer. After an underscore "_" the script name ends with the migration type that is either "up" or "down". Migrations are stored in a directory and are applied in order to a database. Usually the version number of the first migration is 1. The version numbers of the other migrations have to be ascending without gaps.

During processing the content of each migration is read with the binmode of :raw into a scalar. The content is split into sections using the default SQL delimiter ";" (semicolon). Each section is executed independently. All related sections are encapsulated in a database transaction. If a migration embeds stored logic containing one or more semicolons (a PostgreSQL trigger function for example), the migrate() method incorrectly splits the migration into sections, causing an error. You can set a different delimiter to overcome this problem. Add the dbix_migration_delimiter annotation as an SQL comment to the migration

-- dbix_migration_delimiter: /
...

The annotation has to be specified in the first line. The delimiter has to be a single printable ASCII character, excluding the space character. In the previous example it is the "/" (slash) character.

METHODS

$self->debug( $debug )

Enable/Disable debug messages.

$self->dir( $dir )

Get/Set directory that contains migrations.

$self->dsn( $dsn )

Get/Set dsn.

$self->dbh( $dbh )

Get/Set dbh.

$self->migrate( $version )

Migrate database to version. Returns true in case of success; otherwise false. If called without the version argument the newest migration version will be used.

$self->password( $password )

Get/Set database password.

$self->username( $username )

Get/Set database username.

$self->version

Get migration version from database. Will be undef if no migration has taken place yet. The version is stored in the table dbix_migration. The name of this table may change in the future so don't rely on it.

CAVEATS

After the dbh was used for the first time changing the dsn, password, or username has no impact. The reason is the mutable (offering setter methods) design of this module. Changing this will break the backwards compatibility.

SEE ALSO

AUTHOR

Sebastian Riedel, <kraihx@gmail.com>

CONTRIBUTORS

Dan Sully, <dan+github@sully.org>

Marcus Ramberg, <marcus@nordaaker.com>

Steven Jenkin, <sjenkin@venda.com>

Sven Willenbuecher, <sven.willenbuecher@gmx.de>

COPYRIGHT

Copyright 2004-2005 Sebastian Riedel. All rights reserved.

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