Swift y PostgreSQL: la combinación ideal para backend en 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Swift y PostgreSQL: por qué esta combinación es alucinante

\n\n

Cuando 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\n

En 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\n

Aclaremos 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
\n\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\n

Instalación y configuración del controlador PostgreSQL para Swift

\n\n

Empecemos 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.

\n\n

Paso 1: Agregar dependencias

\n\n

Abre Package.swift y agrega:

\n\n
// 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\n

Paso 2: Configurar la conexión a la base de datos

\n\n

En el archivo configure.swift, agrega la configuración:

\n\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\n

Un consejo importante: nunca hardcodees contraseñas en el código. Usa variables de entorno o archivos .env con Vapor's Environment.

\n\n

Creando un modelo de datos en Swift

\n\n

Ahora viene lo más interesante: definamos un modelo de usuario. En Swift con Fluent, esto se hace de manera elegante y concisa:

\n\n
import Fluent\nimport Vapor\n\nfinal                

Blogs

Book Recommendations