Einleitung: Warum brauchen Swift-Entwickler Datenbanken?
Bei der Entwicklung nativer Anwendungen für iOS und macOS besteht häufig die Notwendigkeit, Daten nicht nur lokal (Core Data, UserDefaults), sondern auch auf einem entfernten Server zu speichern. Dies kann Serveranalytik, Protokollierung, Synchronisierung zwischen Geräten oder ein vollwertiges Backend für die Anwendung sein. Die beiden beliebtesten Arten von Datenbanken sind relationale (PostgreSQL) und dokumentenorientierte (MongoDB).
In diesem Artikel werden wir untersuchen, wie man mit PostgreSQL und MongoDB aus einer Swift-Anwendung unter Verwendung gängiger Bibliotheken und Treiber eine Verbindung herstellt. Besonderes Augenmerk legen wir auf die Praxis: Installation von Abhängigkeiten, Schreiben von Abfragen und Fehlerbehandlung.
1. Arbeiten mit PostgreSQL aus Swift
PostgreSQL ist ein leistungsstarkes relationales DBMS, das sich ideal für Projekte eignet, bei denen Datenintegrität und komplexe SQL-Abfragen wichtig sind. In Swift können wir auf zwei Hauptarten mit PostgreSQL arbeiten:
- Über das ORM Fluent (Teil des Vapor-Frameworks) – ein High-Level-Ansatz, praktisch für Webanwendungen.
- Direkt über einen Treiber (z. B.
PostgresNIO) – Low-Level-Kontrolle, geeignet für iOS/macOS-Anwendungen.
Betrachten wir die zweite Variante, da sie kein Vapor erfordert und für normale Anwendungen geeignet ist.
1.1. Verbindung zu PostgreSQL über PostgresNIO
Fügen Sie die Abhängigkeit in Package.swift hinzu:
dependencies: [ .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.18.0")]Beispiel für eine Verbindung und Ausführung einer Abfrage:
import PostgresNIOimport NIOCoreimport NIOPosix
func queryPostgres() async throws { let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1) defer { try? eventLoopGroup.syncShutdownGracefully() }
let config = PostgresConnection.Configuration( host: "localhost", port: 5432, username: "swift_user", password: "secret", database: "test_db", tls: .disable )
let connection = try await PostgresConnection.connect( on: eventLoopGroup.next(), configuration: config ) defer { try? connection.close() }
let rows = try await connection.query("SELECT id, name FROM users LIMIT 5;", logger: nil) for try await row in rows { let id = try row.decode(Int.self, column: "id") let name = try row.decode(String.self, column: "name") print("ID: \\(id), Name: \\(name)") }}Dieser Code stellt eine Verbindung zu einem lokalen PostgreSQL-Server her, führt ein SELECT aus und gibt die Ergebnisse aus. Wichtig: Speichern Sie Passwörter niemals im Code – verwenden Sie Umgebungsvariablen oder die Keychain.
1.2. Einfügen von Daten mit Parametern
Verwenden Sie parametrisierte Abfragen zum Schutz vor SQL-Injection:
let name = "Alice"let age = 30try await connection.query( "INSERT INTO users (name, age) VALUES ($1, $2);", params: [.string(name), .int(age)], logger: nil)2. Arbeiten mit MongoDB aus Swift
MongoDB ist eine NoSQL-Datenbank, die Daten in JSON-ähnlichen Dokumenten (BSON) speichert. Für Swift gibt es den hervorragenden Treiber MongoSwift.
2.1. Installation von MongoSwift
Fügen Sie in Package.swift hinzu:
dependencies: [ .package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.3.0")]2.2. Verbindung und CRUD-Operationen
Beispiel für eine Verbindung zu einer lokalen MongoDB und das Einfügen eines Dokuments:
import MongoSwift
func mongoExample() async throws { let client = try MongoClient("mongodb://localhost:27017") defer { try? client.syncClose() }
let db = client.db("test_database") let collection = db.collection("users")
// Dokument einfügen let document: Document = ["name": "Bob", "age": 25, "city": "Mosc