Swift中的数据库迁移(iOS/macOS):工具概览与示例
数据库迁移是在不丢失现有数据的情况下,对数据模式(表、索引、关系)进行受控更改的过程。在面向Apple平台(iOS、macOS、watchOS、tvOS)的Swift生态系统中,开发者使用多种方法:从内置的Core Data到GRDB.swift和Fluent等第三方库。本文将介绍关键工具、它们的功能,并提供实用的代码示例。
1. Core Data与迁移(轻量级和手动)
Core Data是Apple用于处理对象模型的标准框架。迁移分为两种类型:
- 轻量级迁移(Lightweight Migration) — 如果更改不涉及复杂转换(添加属性、删除、使用映射模型重命名),则自动进行。
- 手动迁移(Manual Migration) — 当需要更改数据类型、合并实体或执行自定义转换时需要。
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("加载Core Data时出错:\\(error)") } } return container}()2. GRDB.swift — 支持迁移的现代SQLite库
GRDB.swift是一个强大的SQLite库,提供了内置的迁移机制。它允许对数据库模式进行版本控制,并顺序执行更改。
通过Swift Package Manager安装:
// Package.swiftdependencies: [ .package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")]使用GRDB.swift的迁移示例:
import GRDB
var migrator = DatabaseMigrator()
// 迁移1:创建表migrator.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() }}
// 迁移2:添加列migrator.registerMigration("v2_add_age") { db in try db.alter(table: "users") { t in t.add(column: "age", .integer).defaults(to: 0) }}
// 应用启动时执行迁移let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")try migrator.migrate(dbQueue)3. Fluent(Vapor)— 服务器端Swift的ORM
Fluent是Vapor框架(面向macOS的服务器端Swift)中包含的ORM。Fluent中的迁移被描述为实现Migration协议的类。
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() }}
// 在configure.swift中注册app.migrations.add(CreateUser())try app.autoMigrate().wait()4. 工具对比
- Core Data — 适用于与对象模型绑定的Apple应用。迁移通常是自动的,但复杂场景需要映射