Jean-Philippe Hallot, and I, are pleased to offer the world risible-db, a new, free, really simple, 100% java open-source utility library for managing database schema migrations in a manner not wholly unlike rails migrations.
The class of interest is (somewhat unimaginatively) called Migrations
, with a convenience subclass called WebInfMigrations
that does a lot of the convention-over-configuration thing for you. Use as follows:
start()
, risible-db will look in a directory called migrations
directly under your application's WEB-INF
directory, for *.sql
files, order them lexicographically, and execute any that have not already been executed against the current datasource. Here's an example:
In this situation, risible-db migrations will execute 003-add-permissions.sql
, and 004-rename-widgets-to-woggles.sql
, because they are not already installed in the migrations table. Unlike Rails, risible-db considers the whole name of the migration, not just the number. So you can have multiple migrations with the same number; in fact risible doesn't care about the numbers at all, but it's a convenient way for you to keep your migrations in order. If you prefer A-add-widgets.sql, B-add-users.sql, etc
, that's ok too.
We found that the strict numbering approach called for a lot of number-management overhead when working in a distributed team - when the half of the team on this continent wanted to add a migration at the same time as the other half on another continent, we needed a way to ensure we wouldn't both use the same number, while simultaneously guaranteeing that the order of migrations respected schema dependencies.
Each .sql
file is a plain text file containing one or more sql commands, separated by semicolons. No comments, please.
Notes:
- Support for Oracle is coming in the next few days - right now it works only for MySQL
- Respect and acknowledgements to Pascal Pratmarty who was the first to say, "well we could do that in java, too!"
- future enhancements include
down
migrations like rails, conditional migrations (eg data migrations only to run in a test environment), other ways to express migrations (java code, for example), and SQL comments. Please comment if there's something on this list (or not) that you can't live without. - download here
- Don't search for documentation. This is it.
- It's LGPL licensed
I just started writing something similar, so I don't need to anymore :-). Thanks, I think I will try it soon.
ReplyDelete