Einführung: Datenbanken im Swift-Ökosystem
Swift hat sich längst über die reine mobile App-Entwicklung hinausentwickelt. Mit dem Aufkommen serverseitiger Frameworks wie Vapor und Perfect ist die Sprache zu einem vollwertigen Werkzeug für den Bau von Backends geworden. Allerdings hat die Arbeit mit Datenbanken in Swift ihre eigenen Besonderheiten. Anders als bei Python oder JavaScript gibt es hier keine integrierten Treiber – alles wird über Drittanbieter-Pakete abgewickelt.
In diesem Artikel erläutern wir, wie man eine Verbindung zu zwei gängigen DBMS herstellt: dem relationalen PostgreSQL und dem dokumentenorientierten MongoDB. Sie erfahren, welche Bibliotheken Sie verwenden, wie Sie die Verbindung konfigurieren und wie Sie grundlegende CRUD-Operationen durchführen. Die Beispiele sind auf iOS/macOS ausgerichtet, der Code funktioniert aber auch in einer Server-Umgebung.
PostgreSQL in Swift: Klassischer Ansatz mit Vapor und Fluent
Auswahl einer Bibliothek
Für die Arbeit mit PostgreSQL in Swift ist Fluent der De-facto-Standard – ein ORM aus dem Vapor-Framework. Fluent unterstützt PostgreSQL, MySQL, SQLite und MongoDB (über einen separaten Treiber). Falls Sie ohne Vapor arbeiten müssen, verwenden Sie PostgresClientKit – einen Low-Level-Treiber.
Verbindungseinrichtung
Fügen Sie die Abhängigkeit zu Package.swift hinzu:
.package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")Grundlegende Konfiguration in configure.swift:
import Fluentimport FluentPostgresDriverimport Vapor
public func configure(_ app: Application) throws { app.databases.use(.postgres( hostname: "localhost", port: 5432, username: "swift_user", password: "secret", database: "swift_db" ), as: .psql) // Migrationen hinzufügen app.migrations.add(CreateUser())}CRUD-Operationen am Beispiel des User-Modells
Erstellen wir ein Modell und eine Migration:
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() }}Beispielabfrage in einem Controller:
// Benutzer erstellenlet user = User(name: "Alexey", email: "alex@example.com")try await user.save(on: req.db)
// Alle Benutzer findenlet users = try await User.query(on: req.db).all()
// Nach E-Mail filternlet filtered = try await User.query(on: req.db) .filter(\\.$email == "alex@example.com") .first()Wichtig: Fluent verwendet Asynchronie via EventLoopFuture oder async/await (ab Vapor 4.60+). Stellen Sie sicher, dass Ihre Umgebung Swift 5.5+ unterstützt.
MongoDB in Swift: Dokumentenflexibilität mit MongoKitten
Auswahl eines Treibers
Für MongoDB ist die Hauptbibliothek MongoKitten. Sie unterstützt alle modernen MongoDB-Versionen, inklusive Atlas (Cloud-Version). Eine Alternative ist MongoSwift von MongoDB Inc., aber MongoKitten gilt als "Swift-typischer" im Stil.
Verbindung zur Datenbank herstellen
Zu Package.swift hinzufügen:
.package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "7.0.0")Verbindungsbeispiel (für iOS/macOS):