Introduction : Pourquoi un développeur Swift a-t-il besoin de bases de données ?
Lors du développement d'applications natives pour iOS et macOS, il est souvent nécessaire de stocker des données non seulement localement (Core Data, UserDefaults), mais aussi sur un serveur distant. Cela peut être de l'analyse côté serveur, de la journalisation, de la synchronisation entre appareils ou un backend complet pour l'application. Les deux types de bases de données les plus populaires sont les bases relationnelles (PostgreSQL) et les bases orientées documents (MongoDB).
Dans cet article, nous allons voir comment se connecter à PostgreSQL et MongoDB depuis une application Swift, en utilisant des bibliothèques et pilotes populaires. Nous accorderons une attention particulière à la pratique : installation des dépendances, écriture de requêtes et gestion des erreurs.
1. Travailler avec PostgreSQL depuis Swift
PostgreSQL est un SGBD relationnel puissant, idéal pour les projets où l'intégrité des données et les requêtes SQL complexes sont importantes. En Swift, nous pouvons travailler avec PostgreSQL de deux manières principales :
- Avec l'ORM Fluent (partie du framework Vapor) — une approche de haut niveau, pratique pour les applications web.
- Directement via un pilote (par exemple,
PostgresNIO) — un contrôle de bas niveau, adapté aux applications iOS/macOS.
Examinons la deuxième option, car elle ne nécessite pas Vapor et convient aux applications classiques.
1.1. Connexion à PostgreSQL via PostgresNIO
Ajoutez la dépendance dans Package.swift :
dependencies: [ .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.18.0")]Exemple de connexion et d'exécution d'une requête :
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)") }}Ce code établit une connexion au serveur PostgreSQL local, exécute un SELECT et affiche les résultats. Important : ne stockez jamais les mots de passe dans le code — utilisez des variables d'environnement ou le Keychain.
1.2. Insertion de données avec paramètres
Pour vous protéger contre les injections SQL, utilisez des requêtes paramétrées :
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. Travailler avec MongoDB depuis Swift
MongoDB est une base de données NoSQL qui stocke les données sous forme de documents de type JSON (BSON). Pour Swift, il existe un excellent pilote MongoSwift.
2.1. Installation de MongoSwift
Ajoutez dans Package.swift :
dependencies: [ .package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.3.0")]2.2. Connexion et opérations CRUD
Exemple de connexion à MongoDB local et d'insertion d'un document :
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")
// Insertion d'un document let document: Document = ["name": "Bob", "age": 25, "city": "Mosc