Swift 数据库操作入门
Swift 早已不再仅仅是移动开发的语言。随着 Vapor 和 Kitura 等服务端框架的出现,Swift 已成为构建后端解决方案的完整工具。任何服务端系统的关键方面都是数据库操作。在本文中,我们将探讨如何连接并与两种流行的数据库管理系统进行交互:关系型 PostgreSQL 和文档型 MongoDB。您将了解使用哪些库、如何配置连接以及如何在纯 Swift 中执行基本的 CRUD 操作。
Swift 中的 PostgreSQL:配置与基本操作
PostgreSQL 是最可靠的关系型数据库之一。在 Swift 中有多个库可用于与其交互,但最流行的是 PostgresNIO——一个基于 SwiftNIO 构建的异步驱动程序。如果您使用 Vapor 框架,则可以通过 ORM Fluent 简化 PostgreSQL 的操作。
通过 PostgresNIO 连接 PostgreSQL
首先添加依赖项。在 Package.swift 中添加:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.18.0") ], targets: [ .target(name: "MyApp", dependencies: [ .product(name: "PostgresNIO", package: "postgres-nio") ]) ])连接并执行简单 SELECT 查询的示例:
import PostgresNIOimport NIOCoreimport NIOPosix
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let config = PostgresConnection.Configuration( host: "localhost", port: 5432, username: "myuser", password: "mypassword", database: "mydb", tls: .disable)
let connection = try await PostgresConnection.connect( on: eventLoopGroup.next(), configuration: config)
let rows = try await connection.query("SELECT id, name FROM users LIMIT 5;", logger: nil)
for try await row in rows { let id: Int = try row["id"].decode(Int.self) let name: String = try row["name"].decode(String.self) print("User: \\(id) - \\(name)")}使用 Vapor Fluent (ORM)
Fluent 提供了用于操作 PostgreSQL 的高级 API。用户模型如下所示:
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 }}
// 创建记录let user = User(name: "Иван", email: "ivan@example.com")try await user.save(on: req.db)
// 查询所有用户let users = try await User.query(on: req.db).all()Swift 中的 MongoDB:文档操作
MongoDB 是一种 NoSQL 数据库,以 BSON(二进制 JSON)格式存储数据。对于 Swift,有由 MongoDB Inc. 开发的官方驱动程序 MongoSwift。它支持异步操作和同步模式。
安装并连接 MongoSwift
在 Package.swift 中添加依赖项:
dependencies: [ .package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.3.0")],targets: [ .target(name: "MyApp", dependencies: [ .product(name: "MongoSwift", package: "mongo-swift-driver") ])]连接到本地 MongoDB 并插入文档的示例:
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")let db = client.db("mydatabase")let collection = db.collection("u