Swift 和 PostgreSQL:为何这个组合令人惊叹
\n\n当我们谈论“服务器端 Swift”时,大多数开发者会想到 Vapor、Perfect 或 Kitura。而谈到数据库时,通常会想到熟悉的 MySQL 或 SQLite。但说实话:如果你用 Swift 构建一个严肃的后端,你需要 PostgreSQL。为什么?因为它不仅仅是一个数据库——它是一个处理数据的瑞士军刀,完美契合 Swift 的强大功能。
\n\n在本文中,我们将探讨如何让 Swift 和 PostgreSQL 协同工作,使你的代码飞驰,数据库稳定运行,让同事们羡慕不已。全是干货——只有实践、代码和真实案例。
\n\n为什么选择 PostgreSQL 而不是 MySQL?
\n\n让我们直接澄清一点。PostgreSQL 是一个对象关系型数据库管理系统,它能做到 MySQL 甚至无法想象的事情:
\n\n- \n
- 原生 JSON 和 JSONB — 直接在表中存储复杂结构 \n
- 数组 — 无需变通方法或额外表 \n
- 并行查询 — 利用服务器的所有核心 \n
- 可扩展性 — PostGIS、TimescaleDB、用于 AI 的 pgvector \n
最重要的是,PostgreSQL 与 SwiftNIO(Vapor 所基于的异步引擎)完美配合。这意味着你的数据库查询不会阻塞执行线程。
\n\n安装和配置 Swift 的 PostgreSQL 驱动
\n\n我们从最重要的事情开始——如何将 PostgreSQL 连接到你的 Swift 项目。我们将使用 vapor/fluent-postgres-driver——最流行且最稳定的驱动。
步骤 1:添加依赖项
\n\n打开 Package.swift 并添加:
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MySwiftBackend",\n platforms: [\n .macOS(.v13)\n ],\n dependencies: [\n .package(url: "https://github.com/vapor/vapor.git", from: "4.90.0"),\n .package(url: "https://github.com/vapor/fluent.git", from: "4.10.0"),\n .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.8.0")\n ],\n targets: [\n .target(\n name: "App",\n dependencies: [\n .product(name: "Vapor", package: "vapor"),\n .product(name: "Fluent", package: "fluent"),\n .product(name: "FluentPostgresDriver", package: "fluent-postgres-driver")\n ]\n )\n ]\n)\n\n步骤 2:配置数据库连接
\n\n在 configure.swift 文件中添加配置:
import Vapor\nimport Fluent\nimport FluentPostgresDriver\n\npublic func configure(_ app: Application) throws {\n // 使用环境变量以确保安全\n let hostname = Environment.get("DB_HOST") ?? "localhost"\n let port = Environment.get("DB_PORT").flatMap(Int.init) ?? 5432\n let username = Environment.get("DB_USERNAME") ?? "swift_user"\n let password = Environment.get("DB_PASSWORD") ?? "swift_pass"\n let database = Environment.get("DB_NAME") ?? "swift_backend"\n\n app.databases.use(\n .postgres(\n hostname: hostname,\n port: port,\n username: username,\n password: password,\n database: database\n ),\n as: .psql\n )\n \n // 注册模型\n app.migrations.add(CreateUser())\n \n // 启动时自动迁移\n try app.autoMigrate().wait()\n}\n\n重要提示:切勿在代码中硬编码密码。使用环境变量或通过 Vapor's Environment 使用 .env 文件。
在 Swift 中创建数据模型
\n\n现在是最有趣的部分——定义用户模型。在 Swift 中使用 Fluent 可以优雅且简洁地完成:
\n\nimport Fluent\nimport Vapor\n\nfinal