Introduction : pourquoi un développeur Swift a-t-il besoin de bases de données ?
Les applications modernes pour iOS et macOS se passent rarement de stockage de données. Qu'il s'agisse d'une liste de tâches, d'un profil utilisateur ou d'un catalogue de produits — les données doivent être sauvegardées et récupérées quelque part. Swift, en tant que langage principal de l'écosystème Apple, fournit des outils puissants pour travailler avec les bases de données (BDD). Dans cet article, nous allons voir comment un développeur débutant peut se connecter et effectuer des opérations CRUD (création, lecture, mise à jour, suppression) avec deux systèmes populaires : le relationnel PostgreSQL et le document-oriented MongoDB.
Nous utiliserons le framework serveur Vapor (basé sur SwiftNIO) pour travailler avec PostgreSQL, et le pilote populaire MongoKitten pour MongoDB. Les deux options conviennent parfaitement pour le backend en Swift. Si vous débutez — n'ayez pas peur : tout le code sera simple et accompagné d'explications.
1. PostgreSQL et Swift : le classique des bases de données relationnelles
PostgreSQL est une base de données relationnelle puissante avec prise en charge de SQL. Pour Swift, la meilleure façon d'interagir est le framework Vapor et son ORM Fluent. Fluent permet de travailler avec les tables comme avec des structures Swift ordinaires.
1.1. Configuration d'un projet Vapor
Commencez par installer Vapor Toolbox et créez un projet :
brew install vaporvapor new MyAppcd MyAppAjoutez la dépendance pour PostgreSQL dans Package.swift :
dependencies: [ .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")]1.2. Modèle et migration
Créons un modèle simple User :
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 }}Maintenant, la migration pour créer la table :
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() }}Enregistrez la migration dans configure.swift :
app.migrations.add(CreateUser())1.3. Opérations CRUD
Création d'un enregistrement (Create) :
let user = User(name: "Иван", email: "ivan@example.com")try await user.save(on: database)Lecture (Read) :
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)Mise à jour (Update) :
guard let user = try await User.find(id, on: database) else { return }user.name = "Новое имя"try await user.update(on: database)Suppression (Delete) :
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)Fluent génère automatiquement les requêtes SQL, ce qui simplifie grandement la vie des débutants.
2. MongoDB et Swift : la flexibilité du NoSQL
MongoDB est une base de données documentaire où les données sont stockées au format BSON (JSON binaire). Pour Swift, nous utilisons la bibliothèque MongoKitten — mature et activement maintenue.