引言:为什么 Swift 开发者需要数据库?
现代的 iOS 和 macOS 应用几乎离不开数据存储。无论是待办事项列表、用户个人资料还是产品目录——数据都需要被保存和检索。作为 Apple 生态系统的主要语言,Swift 提供了强大的数据库操作工具。本文中,我们将介绍初学者开发者如何连接并执行 CRUD 操作(创建、读取、更新、删除),涵盖两个流行系统:关系型数据库 PostgreSQL 和文档型数据库 MongoDB。
我们将使用基于 SwiftNIO 的服务端框架 Vapor 来操作 PostgreSQL,以及广受欢迎的 MongoKitten 驱动来操作 MongoDB。这两个选项都非常适合 Swift 后端开发。如果你是初学者——别担心:所有代码都简单明了且附带详细解释。
1. PostgreSQL 与 Swift:经典关系型数据库
PostgreSQL 是一个支持 SQL 的强大关系型数据库。对于 Swift 而言,与之交互的最佳方式是使用 Vapor 框架及其 ORM Fluent。Fluent 让你可以像操作普通 Swift 结构体一样处理数据库表。
1.1. 搭建 Vapor 项目
首先,安装 Vapor Toolbox 并创建一个项目:
brew install vaporvapor new MyAppcd MyApp在 Package.swift 中添加 PostgreSQL 依赖:
dependencies: [ .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")]1.2. 模型与迁移
我们来创建一个简单的 User 模型:
import Fluentimport Vapor
final class User: Model, Content { static let schema = "users" @ID(key: .id) var id: UUID? @Field(key: "name") var name: String @Field(key: "email") var email: String init() { } init(id: UUID? = nil, name: String, email: String) { self.id = id self.name = name self.email = email }}接下来是用于创建表的迁移:
struct CreateUser: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("users") .id() .field("name", .string, .required) .field("email", .string, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("users").delete() }}在 configure.swift 中注册迁移:
app.migrations.add(CreateUser())1.3. CRUD 操作
创建:
let user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: database)读取:
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)更新:
guard let user = try await User.find(id, on: database) else { return }user.name = "New name"try await user.update(on: database)删除:
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)Fluent 会自动生成 SQL 查询语句,这极大地简化了初学者的使用门槛。
2. MongoDB 与 Swift:NoSQL 的灵活性
MongoDB 是一种文档型数据库,数据以 BSON(二进制 JSON)格式存储。对于 Swift,我们使用 MongoKitten 库——这是一个成熟且活跃维护的驱动。