Introducción: ¿Por qué un desarrollador de Swift necesita bases de datos?
Las aplicaciones modernas de iOS y macOS rara vez prescinden del almacenamiento de datos. Ya sea una lista de tareas, un perfil de usuario o un catálogo de productos: los datos deben guardarse y recuperarse en algún lugar. Swift, como lenguaje principal del ecosistema Apple, proporciona herramientas potentes para trabajar con bases de datos. En este artículo, veremos cómo un desarrollador principiante puede conectar y realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) con dos sistemas populares: el relacional PostgreSQL y el orientado a documentos MongoDB.
Usaremos el framework del lado del servidor Vapor (basado en SwiftNIO) para trabajar con PostgreSQL, y el popular controlador MongoKitten para MongoDB. Ambas opciones son excelentes para el desarrollo backend en Swift. Si estás empezando, no te preocupes: todo el código será simple y estará bien explicado.
1. PostgreSQL y Swift: La base de datos relacional clásica
PostgreSQL es una potente base de datos relacional con soporte SQL. Para Swift, la mejor forma de interactuar es el framework Vapor y su ORM Fluent. Fluent te permite trabajar con tablas como si fueran estructuras regulares de Swift.
1.1. Configuración de un proyecto Vapor
Primero, instala Vapor Toolbox y crea un proyecto:
brew install vaporvapor new MyAppcd MyAppAñade la dependencia para PostgreSQL en 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. Modelo y Migración
Vamos a crear un modelo 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 }}Ahora la migración para crear la tabla:
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() }}Registra la migración en configure.swift:
app.migrations.add(CreateUser())1.3. Operaciones CRUD
Crear:
let user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: database)Leer:
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)Actualizar:
guard let user = try await User.find(id, on: database) else { return }user.name = "New name"try await user.update(on: database)Eliminar:
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)Fluent genera automáticamente consultas SQL, lo que simplifica enormemente la vida a los principiantes.
2. MongoDB y Swift: La flexibilidad de NoSQL
MongoDB es una base de datos documental donde los datos se almacenan en formato BSON (JSON binario). Para Swift, usamos la librería MongoKitten, una madura y activamente soportada.