Swift y PostgreSQL: por qué esta combinación es alucinante
\n\nCuando hablamos de "Swift del lado del servidor", la mayoría de los desarrolladores piensan en Vapor, Perfect o Kitura. Y cuando se trata de bases de datos, vienen a la mente las habituales MySQL o SQLite. Pero seamos honestos: si estás construyendo un backend serio en Swift, necesitas PostgreSQL. ¿Por qué? Porque no es solo una base de datos, es una navaja suiza para trabajar con datos que encaja perfectamente con el poder de Swift.
\n\nEn este artículo, veremos cómo hacer que Swift y PostgreSQL trabajen juntos para que tu código vuele, la base de datos no falle y tus colegas te envidien. Sin rodeos: solo práctica, código y casos reales.
\n\n¿Por qué PostgreSQL y no MySQL?
\n\nAclaremos las cosas de inmediato. PostgreSQL es un sistema de gestión de bases de datos objeto-relacional que puede hacer cosas que MySQL ni siquiera sueña:
\n\n- \n
- JSON y JSONB nativos: almacena estructuras complejas directamente en las tablas \n
- Arreglos: sin soluciones improvisadas ni tablas adicionales \n
- Consultas paralelas: utiliza todos los núcleos del servidor \n
- Extensibilidad: PostGIS, TimescaleDB, pgvector para IA \n
Y lo más importante: PostgreSQL se lleva perfectamente con SwiftNIO (el motor asíncrono sobre el que está construido Vapor). Esto significa que tus consultas a la base de datos no bloquearán el hilo de ejecución.
\n\nInstalación y configuración del controlador PostgreSQL para Swift
\n\nEmpecemos con lo más importante: cómo conectar PostgreSQL a tu proyecto Swift. Usaremos vapor/fluent-postgres-driver, el controlador más popular y estable.
Paso 1: Agregar dependencias
\n\nAbre Package.swift y agrega:
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MySwiftBackend",\n platforms: [\n .macOS(.v13)\n ],\n dependencies: [\n .package(url: "https://github.com/vapor/vapor.git", from: "4.90.0"),\n .package(url: "https://github.com/vapor/fluent.git", from: "4.10.0"),\n .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.8.0")\n ],\n targets: [\n .target(\n name: "App",\n dependencies: [\n .product(name: "Vapor", package: "vapor"),\n .product(name: "Fluent", package: "fluent"),\n .product(name: "FluentPostgresDriver", package: "fluent-postgres-driver")\n ]\n )\n ]\n)\n\nPaso 2: Configurar la conexión a la base de datos
\n\nEn el archivo configure.swift, agrega la configuración:
import Vapor\nimport Fluent\nimport FluentPostgresDriver\n\npublic func configure(_ app: Application) throws {\n // Usa variables de entorno por seguridad\n let hostname = Environment.get("DB_HOST") ?? "localhost"\n let port = Environment.get("DB_PORT").flatMap(Int.init) ?? 5432\n let username = Environment.get("DB_USERNAME") ?? "swift_user"\n let password = Environment.get("DB_PASSWORD") ?? "swift_pass"\n let database = Environment.get("DB_NAME") ?? "swift_backend"\n\n app.databases.use(\n .postgres(\n hostname: hostname,\n port: port,\n username: username,\n password: password,\n database: database\n ),\n as: .psql\n )\n \n // Registra los modelos\n app.migrations.add(CreateUser())\n \n // Automigraciones al iniciar\n try app.autoMigrate().wait()\n}\n\nUn consejo importante: nunca hardcodees contraseñas en el código. Usa variables de entorno o archivos .env con Vapor's Environment.
Creando un modelo de datos en Swift
\n\nAhora viene lo más interesante: definamos un modelo de usuario. En Swift con Fluent, esto se hace de manera elegante y concisa:
\n\nimport Fluent\nimport Vapor\n\nfinal