Datenbankmigrationen in Kotlin: Überblick über Tools und Ansätze

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenbankmigrationen in Kotlin: Vollständiger Leitfaden zu Tools und Ansätzen



Die Verwaltung von Änderungen am Datenbankschema ist eine der zentralen Aufgaben bei der Entwicklung jeder Anwendung. Im Kotlin-Ökosystem gibt es mehrere ausgereifte Lösungen, die diesen Prozess automatisieren. In diesem Artikel betrachten wir drei Hauptansätze: die integrierten Mittel des ORM Exposed, das klassische Flyway und das leistungsstarke Liquibase. Sie erfahren, wie Sie diese in ein Kotlin-Projekt integrieren und welches Tool Sie für welche Aufgaben auswählen sollten.



1. Wozu Migrationen?

Die manuelle Ausführung von SQL-Skripten in verschiedenen Umgebungen (lokale Entwicklungsumgebung, Staging, Produktion) führt unweigerlich zu einer Desynchronisation des Schemas. Migrationen lösen dieses Problem, indem sie Folgendes bieten:

  • Versionierung von Datenbankänderungen
  • Automatische Anwendung neuer Skripte beim Start der Anwendung
  • Möglichkeit des Rollbacks auf eine vorherige Version
  • Teamarbeit ohne Schema-Konflikte


2. Exposed: Native Unterstützung für Migrationen

Exposed ist ein leichtgewichtiges ORM von JetBrains, das in Kotlin geschrieben ist. Seit Version 0.41.0 bietet die Bibliothek einen eigenen Migrationsmechanismus, der sich perfekt in das Kotlin-Ökosystem einfügt.



Installation

// build.gradle.ktsimplementation("org.jetbrains.exposed:exposed-core:0.55.0")implementation("org.jetbrains.exposed:exposed-dao:0.55.0")implementation("org.jetbrains.exposed:exposed-migrations:0.55.0")


Erstellen einer Migration

Jede Migration ist eine Klasse, die von VoidDatabaseMigration erbt:

import org.jetbrains.exposed.sql.transactions.transactionimport org.jetbrains.exposed.sql.SchemaUtilsimport org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.migrations.VoidDatabaseMigration

object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 255) override val primaryKey = PrimaryKey(id)}

class V1__CreateUsersTable : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.create(Users) } }}

class V2__AddEmailColumn : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.addColumn(Users, Users.varchar("email", 255)) } }}


Ausführen der Migrationen

import org.jetbrains.exposed.migrations.ExposedMigrationUtilsimport javax.sql.DataSource

fun runMigrations(dataSource: DataSource) { ExposedMigrationUtils.runMigrations( dataSource = dataSource, migrationsPackage = "com.example.migrations" )}


Vorteile: vollständiger Kotlin-Stil, keine SQL-Dateien, typisierte Spaltennamen.
Nachteile: Bindung an Exposed, kein visueller Tracker, kein Rollback "out of the box".



3. Flyway: Einfachheit und Zuverlässigkeit

Flyway ist das beliebteste Tool für Migrationen in der JVM-Welt. Es funktioniert mit jeder Datenbank und ist unabhängig vom ORM. In Kotlin wird es über das offizielle SDK oder das Gradle-Plugin verwendet.



Einbindung

// build.gradle.ktsimplementation("org.flywaydb:flyway-core:10.20.0")// Für PostgreSQL den Treiber hinzufügen:implementation("org.postgresql:postgresql:42.7.4")


Struktur der Migrationen

Flyway verwendet SQL-Dateien mit einer bestimmten Namensgebung:

db/migration/   V1__create_users.sql   V2__add_email_column.sql   V3__add_role_column.sql


Beispiel einer SQL-Migration (V1__create_users.sql)

CREATE TABLE users (    id SERIAL PRIMARY KEY,    name VARCHAR(255) NOT NULL,    email VARCHAR(255) UNIQUE);


Integration mit Kotlin

import org.flywaydb.core.Flywayimport javax.sql.DataSou                    

Empfehlungen