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.sqlBeispiel 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 Auch in der Bibliothek
GraphQL-Bibliothek TypeScript: Vollständiger Leitfaden zu den Werkzeugen
SMS-Versand mit C++: API-Bibliothek LibCurl und REST-Anfragen
Redis-Client für Go (Golang) — go-redis und radix
Integration von Prometheus-Metriken in PHP: Bibliotheken und Beispiele