Introduction au travail avec les bases de données en Swift
Swift a depuis longtemps cessé d'être un langage exclusivement destiné au développement mobile. Avec l'apparition de frameworks serveur tels que Vapor et Kitura, Swift est devenu un outil à part entière pour créer des solutions backend. Un aspect clé de tout système serveur est le travail avec les bases de données. Dans cet article, nous verrons comment se connecter et interagir avec deux SGBD populaires : le relationnel PostgreSQL et l'orienté documents MongoDB. Vous apprendrez quelles bibliothèques utiliser, comment configurer la connexion et effectuer les opérations CRUD de base en Swift pur.
PostgreSQL en Swift : configuration et opérations de base
PostgreSQL est l'une des bases de données relationnelles les plus fiables. Pour travailler avec elle en Swift, il existe plusieurs bibliothèques, mais la plus populaire est PostgresNIO — un pilote asynchrone basé sur SwiftNIO. Si vous utilisez le framework Vapor, le travail avec PostgreSQL est simplifié grâce à l'ORM Fluent.
Connexion à PostgreSQL via PostgresNIO
Commençons par installer la dépendance. Dans Package.swift, ajoutez :
// swift-tools-version:5.7
import 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")
])
]
)
Exemple de connexion et d'exécution d'une requête SELECT simple :
import PostgresNIO
import NIOCore
import 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)")
}
Travail avec Vapor Fluent (ORM)
Fluent fournit une API de haut niveau pour travailler avec PostgreSQL. Le modèle utilisateur ressemblera à ceci :
import Fluent
import 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
}
}
// Création d'un enregistrement
let user = User(name: "Иван", email: "ivan@example.com")
try await user.save(on: req.db)
// Requête de tous les utilisateurs
let users = try await User.query(on: req.db).all()
MongoDB en Swift : travail avec les documents
MongoDB est une base de données NoSQL qui stocke les données au format BSON (JSON binaire). Pour Swift, il existe un pilote officiel MongoSwift, développé par MongoDB Inc. Il prend en charge les opérations asynchrones et le mode synchrone.
Installation et connexion de MongoSwift
Ajoutez la dépendance dans Package.swift :
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")
])
]
Exemple de connexion à une MongoDB locale et d'insertion d'un document :
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")
let db = client.db("mydatabase")
let collection = db.collection("u