Introduction : Les bases de données dans l'écosystème Swift
Swift a depuis longtemps dépassé le simple développement d'applications mobiles. Avec l'émergence de frameworks côté serveur tels que Vapor et Perfect, le langage est devenu un outil à part entière pour construire des backends. Cependant, travailler avec des bases de données en Swift a ses spécificités. Contrairement à Python ou JavaScript, il n'y a pas de pilotes intégrés ici — tout est géré via des packages tiers.
Dans cet article, nous allons décomposer comment se connecter à deux SGBD populaires : le relationnel PostgreSQL et l'orienté document MongoDB. Vous apprendrez quelles bibliothèques utiliser, comment configurer la connexion et comment effectuer des opérations CRUD de base. Les exemples sont destinés à iOS/macOS, mais le code fonctionnera également dans un environnement serveur.
PostgreSQL en Swift : Approche classique avec Vapor et Fluent
Choisir une bibliothèque
Pour travailler avec PostgreSQL en Swift, le standard de facto est Fluent — un ORM du framework Vapor. Fluent prend en charge PostgreSQL, MySQL, SQLite et MongoDB (via un pilote séparé). Si vous devez travailler sans Vapor, utilisez PostgresClientKit — un pilote de bas niveau.
Configuration de la connexion
Ajoutez la dépendance à Package.swift :
.package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")Configuration de base dans 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) // Ajouter des migrations app.migrations.add(CreateUser())}Opérations CRUD avec le modèle Utilisateur comme exemple
Créons un modèle et une 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() }}Exemple de requête dans un contrôleur :
// Créer un utilisateurlet user = User(name: "Alexey", email: "alex@example.com")try await user.save(on: req.db)
// Trouver tous les utilisateurslet users = try await User.query(on: req.db).all()
// Filtrer par emailllet filtered = try await User.query(on: req.db) .filter(\\.$email == "alex@example.com") .first()Important : Fluent utilise l'asynchronie via EventLoopFuture ou async/await (à partir de Vapor 4.60+). Assurez-vous que votre environnement prend en charge Swift 5.5+.
MongoDB en Swift : Flexibilité des documents avec MongoKitten
Choisir un pilote
Pour MongoDB, la bibliothèque principale est MongoKitten. Elle prend en charge toutes les versions modernes de MongoDB, y compris Atlas (version cloud). Une alternative est MongoSwift de MongoDB Inc., mais MongoKitten est considéré comme plus "Swift-like" dans le style.
Connexion à la base de données
Ajoutez à Package.swift :
.package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "7.0.0")Exemple de connexion (pour iOS/macOS) :