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
Cryptographie en Java : chiffrement et hachage – guide pratique
Conteneurs d'injection de dépendances en Rust : aperçu et implémentation avec l'exemple de « dicy »
Travailler avec les archives ZIP en PHP : guide complet sur ZipArchive
Framework Laravel pour PHP : guide complet avec exemples
Packages Spatie pour PHP : guide complet avec exemples