Power Tools Woche

Flyway ist ein einfaches Tool, das die Migration von Datenbanken zum Kinderspiel macht

Christian Grobmeier

Nun ist es mit Cayenne so, dass ich keine DataSource im Spring-Kontext brauche. Cayenne kümmert sich selbst darum, und Entsprechendes wird im Web-Filter erledigt. Würde ich also eine solche Bean definieren, wäre diese für alle Zeiten verfügbar, auch wenn ich sie nie brauchen würde. Daher wollte ich Flyway erweitern, mich dort selbst um die Verbindung kümmern und diese im Anschluss wieder schließen. Da Flyway sehr leicht zu erweitern ist, kann man das eher übersichtliche Ergebnis im Listing 3 bewundern. Hier geschieht nicht gerade schwarze Magie. Der Code sagt alles aus: Ich konfiguriere und setze die Datenquelle, rufe migrate() auf und gebe das Ergebnis zurück. Fertig. Der dazugehörige Spring-Kontext, der seine Parameter aus einem Maven-Profil erhält, ist dann in Listing 4 zu sehen.

Listing 3

public class FlywayBean extends com.googlecode.flyway.core.Flyway {
    public int migrate() throws FlywayException {
            BasicDataSource dataSource = new BasicDataSource();
            // Datenquelle konfigurieren
            this.setDataSource(dataSource);
            int result = super.migrate();
            // Datenquelle schließen
            return result;
        }
        return 0;
    }
    // Getter, Setter
}
Listing 4

${db.driver}

Dort müssen wir als Init-Methode migrate angeben. Und Lazy-Init steht auf false. Die Bean wird demnach sofort erstellt, wenn der Context geladen wird. Da es die einzige Bean mit dieser Einstellung ist und alles andere sowieso später (im Web-Filter) geladen wird, ist dies für mich in Ordnung.

Die Properties zu den Datenbankparametern dürften kein Problem darstellen. Interessant ist hier der Parameter baseDir, der vorgibt, wo meine SQL-Skripte liegen. In meinem Fall liegen diese im Ordner:

/src/main/resources/db/migration

Jeder Skriptname beginnt mit einem großen V. Diese Konvention ist unantastbar. Im Anschluss folgt die Versionsnummer, getrennt mit Unterstrichen. Weitere Zeichen sind bei Bedarf erlaubt. In meinem Fall sieht also ein Versionsskript so aus:

V2_2_7_timeandbill

Neue Skripte würden dann einfach hochgezählt werden, wie man es eben kennt. Wer in einem bestehenden Projekt Flyway einführen will, sollte zusehen, dass seine Datenbank sauber ist, und ein initiales Skript machen. Dann kann die Datenbank selbst mit einer Versionsnummer versehen werden. Das sieht dann etwas so aus:

mvn flyway:init -Dflyway.initialVersion=2.2.7.timeandbill -Dflyway.initialDescription="Base version"

Die Datenbank wird dann mit jener Version geführt, und nur spätere Änderungen werden durchgeführt.

Fazit

Flyway ist einfach und kann trotzdem so einiges. Mit Kommandozeile, Ant und Maven-Unterstützung kann man das Tool in den meisten Umgebungen unterbringen. Auch werden die meisten üblichen Datenbanken (die relationalen) unterstützt. Die Dokumentation ist sehr gut, und die Entwicklung geht beständig weiter. Erst im Juli ist Version 1.7 erschienen, die neben zahlreichen Bugs auch Abhängigkeiten reduziert hat (so ist nun Spring optional). Wer also eher die einfache Lösung für seine Datenbankmigrationen sucht, der ist mit Flyway bestens beraten. Mit den SQL- und Java-Migrations werden wohl die wichtigsten Anwendungsfälle abgedeckt. Und wer mehr braucht: Flyway ist natürlich Open Source und steht unter der Apache License 2.0 zur Verfügung. Erweiterungen und Bugfixes werden auch in diesem Projekt gerne gesehen.

Christian Grobmeier ist freier Softwareentwickler und Trainer. Er interessiert sich für effizientes Programmieren und arbeitet gerade an Time & Bill. Als Apache Software Foundation Member hinterlässt er seine Spuren in verschiedenen Open-Source-Projekten, unter anderem im Apache-Logging-Projekt. Mehr Grobmeier?
Geschrieben von
Christian Grobmeier
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.