/usr/local/perl/lib/site_perl/5.8.5/SQL/Translator/Diff.pm |
SQL::Translator::Diff
Takes two input SQL::Translator::Schemas (or SQL files) and produces ALTER statments to make them the same
Simplest usage:
use SQL::Translator::Diff; my $sql = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $target_schema, 'MySQL', $options_hash)
OO usage:
use SQL::Translator::Diff; my $diff = SQL::Translator::Diff->new({ output_db => 'MySQL', source_schema => $source_schema, target_schema => $target_schema, %$options_hash, })->compute_differences->produce_diff_sql;
ALTER TABLE
statement even if the producer
supports the ability to do all alters for a table as one statement.
The following producer functions should be implemented for completeness. If any of them are needed for a given diff, but not found, an error will be thrown.
alter_create_constraint($con)
alter_drop_constraint($con)
alter_create_index($idx)
alter_drop_index($idx)
add_field($fld)
alter_field($old_fld, $new_fld)
rename_field($old_fld, $new_fld)
drop_field($fld)
alter_table($table)
drop_table($table)
rename_table($old_table, $new_table)
(optional)batch_alter_table($table, $hash)
(optional)batch_alter_table
, it will be called with the
table to alter and a hash, the keys of which will be the method names listed
above; values will be arrays of fields or constraints to operate on. In the
case of the field functions that take two arguments this will appear as a hash.
I.e. the hash might look something like the following:
{ alter_create_constraint => [ $constraint1, $constraint2 ], add_field => [ $field ], alter_field => [ [$old_field, $new_field] ] }
preprocess_schema($class, $schema)
(optional)preprocess_schema
is called by the Diff code to allow the producer to
normalize any data it needs to first. For example, the MySQL producer uses
this method to ensure that FK contraint names are unique.
Basicaly any changes that need to be made to produce the SQL file for the schema should be done here, so that a diff between a parsed SQL file and (say) a parsed DBIx::Class::Schema object will be sane.
(As an aside, DBIx::Class, for instance, uses the presence of a
preprocess_schema
function on the producer to know that it can diff between
the previous SQL file and its own internal representation. Without this method
on th producer it will diff the two SQL files which is slower, but known to
work better on old-style producers.)
Original Author(s)
unknown.
Refactor/re-write and more comprehensive tests by Ash Berlin ash@cpan.org
.
Redevelopment sponsored by Takkle Inc.
/usr/local/perl/lib/site_perl/5.8.5/SQL/Translator/Diff.pm |