Einträge tagged mit “migration”

Observer in Migration ausschalten

Vor einiger Zeit erwähnten wir die Komplikationen, die auftreten können, wenn man Migrationen in Rails mit den realen Modellen der Anwendung durchführt. Um Validierungen, before_update-Methoden und ähnliches während der Migration auszuschalten, ist es oft günstig, der Migration eine eigene Version des Models zu geben.
Dazu noch ein Tipp:
Mit Model.delete_observers können Observer, welche am Model lauschen, entfernt werden. Da die Observer vom eigentlichen Model unabhängig sind, ist während der Migration nicht garantiert, dass die Observer problemlos arbeiten können.

Cache-Probleme bei nicht-migrierter DB

Vor einiger Zeit berichteten wir über eine Möglichkeit, Datenbank-Aktualisierungen auch unter JRuby einfach nach dem Deployment durchzuführen, indem man die Migration über den Browser anstößt.
Wir haben das nun schon eine Weile - auch produktiv - im Einsatz und sind sehr zufrieden damit. Es gibt aber einen Punkt, den man bei der Anwendungsentwicklung im Blick haben muss.

Statische Migrationen, flexible Anwendung

Da wir unsere Projekte meist im Team bearbeiten, standen wir schon öfter vor folgendem Problem:
Ein Entwickler startet ein neues Projekt und legt das Model User an. Da das Projekt am Anfang steht, hat der User erst mal nur ein Login. In der Migration wird auch gleich ein "admin"-User angelegt. Ein paar Tage später wird entschieden, dass beim User auch Vor- und Nachname benötigt werden. Also legt der Entwickler eine Migration an, die dem User diese Felder hinzufügt und das User-Model erhält Validierungen, damit die Vor- und Nachnamen auch befüllt werden.

Nun kommt ein zweiter Entwickler zum Projekt hinzu. Er checkt die Sourcen frisch aus und will seine Entwicklungs-DB migrieren. Schon die erste Migration schlägt fehl, da diese den "admin"-User ohne Vor- und Nachnamen anlegen will. Auch später im Produktivsystem funktioniert diese Migration nicht mehr.
Noch spannender wird es, wenn im Laufe der Zeit durch ein Refactoring ein Model ganz entfernt wurde. Alle vorangehenden Migrationen, die irgendwie auf die Klasse zugreifen wollen, schlagen fehl. Kurzum: Die Anwendung entwickelt sich dynamisch, während die Migrationen zum jeweiligen Anwendungsstand in Stein gemeißelt werden.

Datenbankmigration im Browser

Für die Verwaltung der Änderungen an der Datenbank gibt es in Rails das mächtige Konzept der Migrationsskripte. Da dies Ruby-Skripte sind, steht einem der volle Funktionsumfang von Ruby und Rails zur Verfügung. Allerdings benötigt man zum Durchführen einer Migration eine Rails-Umgebung mit Zugriff auf die Datenbank, in der man die Migrationsskripte ausführen kann. Während der Entwicklung ist das keine Hürde, aber bereits in Test- und spätestens in Produktionsumgebungen könnte das zum Problem werden.

Besonders wenn man Rails mittels JRuby in eine Java-Umgebung eingeführt hat, wird in der Produktionsumgebung auf der Konsole kein Rails verfügbar sein. Viele Unternehmen reglementieren zudem den Zugriff auf die Datenbank, so dass Entwickler die Produktionsdatenbank nicht erreichen können oder die Zugangsdaten nicht kennen. Die Anwendung kann aber auf die Datenbank zugreifen - warum nicht die Migration über die Anwendung auslösen?

JRuby Entwicklung jetzt mit Git

Seit gestern kann man JRuby auch bei dem in der "Ruby on Rails" Gemeinde weit verbreiteten und bekannten GitHub Repository herunterladen. Das wird, wie Nick Sieger in seinem Blog mitteilt (JRuby Moves to Git), durch die erfolgreiche Umstellung der JRuby Entwicklung auf das freie verteilte Versionskontrollsystem Git ermöglicht.
1