Datenbankmigrationen in Swift (iOS/macOS): Tool-Übersicht und Beispiele
\n\nDatenbankmigrationen sind der Prozess der kontrollierten Änderung des Datenschemas (Tabellen, Indizes, Beziehungen) ohne Verlust bereits vorhandener Informationen. Im Swift-Ökosystem für Apple-Plattformen (iOS, macOS, watchOS, tvOS) verwenden Entwickler mehrere Ansätze: vom integrierten Core Data bis hin zu Drittanbieter-Bibliotheken wie GRDB.swift und Fluent. In diesem Artikel analysieren wir die wichtigsten Tools, ihre Funktionen und geben praktische Codebeispiele.
\n\n1. Core Data und Migrationen (leichtgewichtig und manuell)
\n\nCore Data ist das Standard-Framework von Apple für die Arbeit mit einem Objektmodell. Migrationen werden in zwei Typen unterteilt:
\n- \n
- Leichtgewichtige Migration (Lightweight Migration) – automatisch, wenn die Änderungen keine komplexen Transformationen betreffen (Hinzufügen von Attributen, Löschen, Umbenennen mit Mapping Model). \n
- Manuelle Migration (Manual Migration) – erforderlich, wenn Datentypen geändert, Entitäten zusammengeführt oder benutzerdefinierte Transformationen durchgeführt werden müssen. \n
Beispiel für die Konfiguration einer leichtgewichtigen Migration in Swift:
\nimport CoreData\n\nlazy var persistentContainer: NSPersistentContainer = {\n let container = NSPersistentContainer(name: "MyDataModel")\n let description = container.persistentStoreDescriptions.first\n description?.shouldMigrateStoreAutomatically = true\n description?.shouldInferMappingModelAutomatically = true\n container.loadPersistentStores { _, error in\n if let error = error {\n fatalError("Fehler beim Laden von Core Data: \\(error)")\n }\n }\n return container\n}()\n\n\n2. GRDB.swift – moderne SQLite-Bibliothek mit Migrationen
\n\nGRDB.swift ist eine leistungsstarke Bibliothek für die Arbeit mit SQLite, die einen integrierten Migrationsmechanismus bietet. Sie ermöglicht die Versionierung des Datenbankschemas und die sequenzielle Durchführung von Änderungen.
\n\nInstallation über den Swift Package Manager:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")\n]\n\n\nBeispiel einer Migration mit GRDB.swift:
\nimport GRDB\n\nvar migrator = DatabaseMigrator()\n\n// Migration 1: Tabelle erstellen\nmigrator.registerMigration("v1_create_users") { db in\n try db.create(table: "users") { t in\n t.autoIncrementedPrimaryKey("id")\n t.column("name", .text).notNull()\n t.column("email", .text).unique()\n }\n}\n\n// Migration 2: Spalte hinzufügen\nmigrator.registerMigration("v2_add_age") { db in\n try db.alter(table: "users") { t in\n t.add(column: "age", .integer).defaults(to: 0)\n }\n}\n\n// Migrationen beim Start der Anwendung anwenden\nlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")\ntry migrator.migrate(dbQueue)\n\n\n3. Fluent (Vapor) – ORM für serverseitiges Swift
\n\nFluent ist ein ORM, das Teil des Vapor-Frameworks ist (serverseitiges Swift für macOS). Migrationen in Fluent werden als Klassen beschrieben, die das Protokoll Migration implementieren.
Beispiel einer Migration für Fluent 4:
\nimport Fluent\n\nstruct CreateUser: Migration {\n func prepare(on database: Database) -> EventLoopFuture<Void> {\n database.schema("users")\n .id()\n .field("name", .string, .required)\n .field("email", .string, .required).unique(on: "email")\n .create()\n }\n \n func revert(on database: Database) -> EventLoopFuture<Void> {\n database.schema("users").delete()\n }\n}\n\n// Registrierung in configure.swift\napp.migrations.add(CreateUser())\ntry app.autoMigrate().wait()\n\n\n4. Vergleich der Tools
\n\n- \n
- Core Data – geeignet für Apple-Anwendungen mit Bindung an das Objektmodell. Migrationen sind oft automatisch, aber komplexe Szenarien erfordern Mapping
Auch in der Bibliothek
Logging in Java: Überblick über die besten Bibliotheken und Lösungen
Arbeiten mit Markdown in Go (Golang): Bibliotheken, Parsing und Konvertierung
JSON-Verarbeitung in JavaScript (Node.js): Vollständiger Leitfaden
PDF-Generierung in JavaScript (Node.js): Bibliotheken und Werkzeuge zur Erstellung von PDFs
gRPC für TypeScript: Bibliotheken und Anwendungsbeispiele