Migrações de banco de dados em Swift (iOS/macOS): visão geral de ferramentas e exemplos
Migrações de banco de dados são o processo de alteração controlada do esquema de dados (tabelas, índices, relacionamentos) sem perda de informações já existentes. No ecossistema Swift para plataformas Apple (iOS, macOS, watchOS, tvOS), os desenvolvedores usam várias abordagens: desde o Core Data integrado até bibliotecas de terceiros, como GRDB.swift e Fluent. Neste artigo, analisaremos as principais ferramentas, seus recursos e forneceremos exemplos práticos de código.
1. Core Data e migrações (leves e manuais)
Core Data é o framework padrão da Apple para trabalhar com modelo de objetos. As migrações são divididas em dois tipos:
- Migração leve (Lightweight Migration) — automática, se as alterações não envolverem transformações complexas (adição de atributos, exclusão, renomeação com mapping model).
- Migração manual (Manual Migration) — necessária quando é preciso alterar tipos de dados, mesclar entidades ou realizar transformações personalizadas.
Exemplo de configuração de migração leve em Swift:
import CoreData
lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "MyDataModel") let description = container.persistentStoreDescriptions.first description?.shouldMigrateStoreAutomatically = true description?.shouldInferMappingModelAutomatically = true container.loadPersistentStores { _, error in if let error = error { fatalError("Erro ao carregar Core Data: \\(error)") } } return container}()2. GRDB.swift — biblioteca SQLite moderna com migrações
GRDB.swift é uma biblioteca poderosa para trabalhar com SQLite, que oferece um mecanismo de migração integrado. Ela permite versionar o esquema do banco de dados e executar alterações sequencialmente.
Instalação via Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")]Exemplo de migração com GRDB.swift:
import GRDB
var migrator = DatabaseMigrator()
// Migração 1: criação da tabelamigrator.registerMigration("v1_create_users") { db in try db.create(table: "users") { t in t.autoIncrementedPrimaryKey("id") t.column("name", .text).notNull() t.column("email", .text).unique() }}
// Migração 2: adição de colunamigrator.registerMigration("v2_add_age") { db in try db.alter(table: "users") { t in t.add(column: "age", .integer).defaults(to: 0) }}
// Aplicação das migrações na inicialização do aplicativolet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")try migrator.migrate(dbQueue)3. Fluent (Vapor) — ORM para Swift no servidor
Fluent é um ORM que faz parte do framework Vapor (Swift no servidor para macOS). As migrações no Fluent são descritas como classes que implementam o protocolo Migration.
Exemplo de migração para Fluent 4:
import Fluent
struct CreateUser: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("users") .id() .field("name", .string, .required) .field("email", .string, .required).unique(on: "email") .create() } func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("users").delete() }}
// Registro em configure.swiftapp.migrations.add(CreateUser())try app.autoMigrate().wait()4. Comparação de ferramentas
- Core Data — adequado para aplicativos Apple com vínculo ao modelo de objetos. As migrações são frequentemente automáticas, mas cenários complexos exigem mappin