Einführung in die Arbeit mit Datenbanken in Swift
Swift ist längst nicht mehr nur eine Sprache für die mobile Entwicklung. Mit dem Aufkommen von Server-Frameworks wie Vapor und Kitura ist Swift zu einem vollwertigen Werkzeug für die Erstellung von Backend-Lösungen geworden. Ein zentraler Aspekt jedes Serversystems ist die Arbeit mit Datenbanken. In diesem Artikel betrachten wir, wie man sich mit zwei populären DBMS verbindet und interagiert: der relationalen PostgreSQL und der dokumentenorientierten MongoDB. Sie erfahren, welche Bibliotheken verwendet werden, wie man die Verbindung einrichtet und grundlegende CRUD-Operationen in reinem Swift durchführt.
PostgreSQL in Swift: Einrichtung und grundlegende Operationen
PostgreSQL ist eine der zuverlässigsten relationalen Datenbanken. Für die Arbeit mit ihr in Swift gibt es mehrere Bibliotheken, aber die beliebteste ist PostgresNIO – ein asynchroner Treiber, der auf SwiftNIO basiert. Wenn Sie das Vapor-Framework verwenden, wird die Arbeit mit PostgreSQL durch das ORM Fluent vereinfacht.
Verbindung zu PostgreSQL über PostgresNIO
Beginnen wir mit der Installation der Abhängigkeit. Fügen Sie in Package.swift hinzu:
// 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") ]) ])Beispiel für eine Verbindung und die Ausführung einer einfachen SELECT-Abfrage:
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)")}Arbeit mit Vapor Fluent (ORM)
Fluent bietet eine hochwertige API für die Arbeit mit PostgreSQL. Ein Benutzermodell würde wie folgt aussehen:
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 }}
// Erstellen eines Datensatzeslet user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: req.db)
// Abfrage aller Benutzerlet users = try await User.query(on: req.db).all()MongoDB in Swift: Arbeit mit Dokumenten
MongoDB ist eine NoSQL-Datenbank, die Daten im BSON-Format (Binary JSON) speichert. Für Swift gibt es den offiziellen Treiber MongoSwift, der von MongoDB Inc. entwickelt wurde. Er unterstützt asynchrone Operationen sowie den synchronen Modus.
Installation und Verbindung von MongoSwift
Fügen Sie die Abhängigkeit in Package.swift hinzu:
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") ])]Beispiel für die Verbindung zu einer lokalen MongoDB und das Einfügen eines Dokuments:
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")let db = client.db("mydatabase")let collection = db.collection("u