Introdução: Bancos de Dados no Ecossistema Swift
O Swift há muito tempo foi além do simples desenvolvimento de aplicativos móveis. Com o surgimento de frameworks server-side como Vapor e Perfect, a linguagem se tornou uma ferramenta completa para a construção de backends. No entanto, trabalhar com bancos de dados em Swift tem suas particularidades. Diferente de Python ou JavaScript, não há drivers nativos aqui — tudo é feito através de pacotes de terceiros.
Neste artigo, vamos detalhar como se conectar a dois SGBDs populares: o relacional PostgreSQL e o orientado a documentos MongoDB. Você aprenderá quais bibliotecas usar, como configurar a conexão e como realizar operações CRUD básicas. Os exemplos são voltados para iOS/macOS, mas o código também funcionará em um ambiente servidor.
PostgreSQL em Swift: Abordagem Clássica com Vapor e Fluent
Escolhendo uma Biblioteca
Para trabalhar com PostgreSQL em Swift, o padrão de facto é o Fluent — um ORM do framework Vapor. O Fluent suporta PostgreSQL, MySQL, SQLite e MongoDB (através de um driver separado). Se você precisar trabalhar sem o Vapor, use o PostgresClientKit — um driver de baixo nível.
Configuração da Conexão
Adicione a dependência ao Package.swift:
.package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")Configuração básica no configure.swift:
import Fluentimport FluentPostgresDriverimport Vapor
public func configure(_ app: Application) throws { app.databases.use(.postgres( hostname: "localhost", port: 5432, username: "swift_user", password: "secret", database: "swift_db" ), as: .psql) // Adicionar migrações app.migrations.add(CreateUser())}Operações CRUD Usando o Modelo User como Exemplo
Vamos criar um modelo e uma migração:
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 }}
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() }}Exemplo de consulta em um controller:
// Criar um usuáriolet user = User(name: "Alexey", email: "alex@example.com")try await user.save(on: req.db)
// Buscar todos os usuárioslet users = try await User.query(on: req.db).all()
// Filtrar por emailet filtered = try await User.query(on: req.db) .filter(\\.$email == "alex@example.com") .first()Importante: O Fluent usa assincronia via EventLoopFuture ou async/await (a partir do Vapor 4.60+). Certifique-se de que seu ambiente suporta Swift 5.5+.
MongoDB em Swift: Flexibilidade de Documentos com MongoKitten
Escolhendo um Driver
Para MongoDB, a biblioteca principal é o MongoKitten. Ela suporta todas as versões modernas do MongoDB, incluindo o Atlas (versão em nuvem). Uma alternativa é o MongoSwift da MongoDB Inc., mas o MongoKitten é considerado mais "Swifty" em estilo.
Conectando ao Banco de Dados
Adicione ao Package.swift:
.package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "7.0.0")Exemplo de conexão (para iOS/macOS):