Migrations de bases de données en Swift (iOS/macOS) : aperçu des outils et exemples
\n\nLes migrations de bases de données sont le processus de modification contrôlée du schéma de données (tables, index, relations) sans perte des informations existantes. Dans l'écosystème Swift pour les plateformes Apple (iOS, macOS, watchOS, tvOS), les développeurs utilisent plusieurs approches : de Core Data intégré aux bibliothèques tierces comme GRDB.swift et Fluent. Dans cet article, nous analyserons les outils clés, leurs fonctionnalités et fournirons des exemples pratiques de code.
\n\n1. Core Data et migrations (légères et manuelles)
\n\nCore Data est le framework standard d'Apple pour travailler avec un modèle objet. Les migrations se divisent en deux types :
\n- \n
- Migration légère (Lightweight Migration) — automatique, si les modifications n'impliquent pas de transformations complexes (ajout d'attributs, suppression, renommage avec mapping model). \n
- Migration manuelle (Manual Migration) — nécessaire lorsqu'il faut modifier les types de données, fusionner des entités ou effectuer des transformations personnalisées. \n
Exemple de configuration d'une migration légère en 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("Erreur de chargement de Core Data : \\(error)")\n }\n }\n return container\n}()\n\n\n2. GRDB.swift — bibliothèque SQLite moderne avec migrations
\n\nGRDB.swift est une bibliothèque puissante pour travailler avec SQLite, qui propose un mécanisme de migration intégré. Elle permet de versionner le schéma de la base de données et d'effectuer les modifications de manière séquentielle.
\n\nInstallation via Swift Package Manager :
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")\n]\n\n\nExemple de migration avec GRDB.swift :
\nimport GRDB\n\nvar migrator = DatabaseMigrator()\n\n// Migration 1 : création de la table\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 : ajout d'une colonne\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// Application des migrations au démarrage de l'application\nlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")\ntry migrator.migrate(dbQueue)\n\n\n3. Fluent (Vapor) — ORM pour Swift côté serveur
\n\nFluent est un ORM faisant partie du framework Vapor (Swift côté serveur pour macOS). Les migrations dans Fluent sont décrites comme des classes implémentant le protocole Migration.
Exemple de migration pour 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// Enregistrement dans configure.swift\napp.migrations.add(CreateUser())\ntry app.autoMigrate().wait()\n\n\n4. Comparaison des outils
\n\n- \n
- Core Data — adapté aux applications Apple liées au modèle objet. Les migrations sont souvent automatiques, mais les scénarios complexes nécessitent un mappin
Aussi dans la bibliothèque
Files d'attente de tâches en Java : Aperçu et implémentation avec java.util.concurrent
Travailler avec les archives ZIP en Java : java.util.zip et Zip4j
Chalk JavaScript (Node.js) : guide complet avec exemples
Event Bus et le pattern Observer en JavaScript (Node.js) — création de systèmes d'événements flexibles
Génération Swagger/OpenAPI pour C# (.NET) : Swashbuckle et NSwag