Introducción al trabajo con bases de datos en Swift
Swift hace tiempo que dejó de ser un lenguaje exclusivo para el desarrollo móvil. Con la aparición de frameworks de servidor como Vapor y Kitura, Swift se ha convertido en una herramienta completa para crear soluciones backend. Un aspecto clave de cualquier sistema de servidor es el trabajo con bases de datos. En este artículo, veremos cómo conectarse e interactuar con dos SGBD populares: la relacional PostgreSQL y la orientada a documentos MongoDB. Aprenderá qué bibliotecas usar, cómo configurar la conexión y realizar operaciones CRUD básicas en Swift puro.
PostgreSQL en Swift: configuración y operaciones básicas
PostgreSQL es una de las bases de datos relacionales más confiables. Para trabajar con ella en Swift existen varias bibliotecas, pero la más popular es PostgresNIO, un controlador asíncrono construido sobre SwiftNIO. Si usa el framework Vapor, el trabajo con PostgreSQL se simplifica a través del ORM Fluent.
Conexión a PostgreSQL mediante PostgresNIO
Comencemos con la instalación de la dependencia. En Package.swift agregue:
// swift-tools-version:5.7import 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") ]) ])Ejemplo de conexión y ejecución de una consulta SELECT simple:
import PostgresNIOimport NIOCoreimport 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)")}Trabajo con Vapor Fluent (ORM)
Fluent proporciona una API de alto nivel para trabajar con PostgreSQL. El modelo de usuario se vería así:
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 }}
// Crear un registrolet user = User(name: "Iván", email: "ivan@example.com")try await user.save(on: req.db)
// Consultar todos los usuarioslet users = try await User.query(on: req.db).all()MongoDB en Swift: trabajo con documentos
MongoDB es una base de datos NoSQL que almacena datos en formato BSON (JSON binario). Para Swift existe el controlador oficial MongoSwift, desarrollado por MongoDB Inc. Soporta operaciones asíncronas y modo síncrono.
Instalación y conexión de MongoSwift
Agregue la dependencia en 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") ])]Ejemplo de conexión a MongoDB local e inserción de un documento:
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")let db = client.db("mydatabase")let collection = db.collection("u