Introdução: por que um desenvolvedor Swift precisa de bancos de dados?
Aplicativos modernos para iOS e macOS raramente funcionam sem armazenamento de dados. Seja uma lista de tarefas, um perfil de usuário ou um catálogo de produtos — os dados precisam ser salvos e recuperados em algum lugar. O Swift, como principal linguagem do ecossistema Apple, fornece ferramentas poderosas para trabalhar com bancos de dados (BD). Neste artigo, vamos explicar como um desenvolvedor iniciante pode se conectar e realizar operações CRUD (criação, leitura, atualização, exclusão) com dois sistemas populares: o relacional PostgreSQL e o orientado a documentos MongoDB.
Usaremos o framework de servidor Vapor (baseado em SwiftNIO) para trabalhar com PostgreSQL, e o driver popular MongoKitten para MongoDB. Ambas as opções são excelentes para backend em Swift. Se você está começando — não tenha medo: todo o código será simples e com explicações.
1. PostgreSQL e Swift: o clássico dos bancos de dados relacionais
PostgreSQL é um poderoso banco de dados relacional com suporte a SQL. Para Swift, a melhor maneira de interagir é através do framework Vapor e seu ORM Fluent. O Fluent permite trabalhar com tabelas como se fossem estruturas Swift comuns.
1.1. Configuração do projeto Vapor
Primeiro, instale o Vapor Toolbox e crie um projeto:
brew install vaporvapor new MyAppcd MyAppAdicione a dependência para PostgreSQL no 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 e migração
Vamos criar um modelo simples 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 }}Agora, a migração para criar a tabela:
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() }}Registre a migração no configure.swift:
app.migrations.add(CreateUser())1.3. Operações CRUD
Criação de registro (Create):
let user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: database)Leitura (Read):
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)Atualização (Update):
guard let user = try await User.find(id, on: database) else { return }user.name = "Novo nome"try await user.update(on: database)Exclusão (Delete):
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)O Fluent gera automaticamente as consultas SQL, o que simplifica muito a vida dos iniciantes.
2. MongoDB e Swift: a flexibilidade do NoSQL
MongoDB é um banco de dados documental, onde os dados são armazenados no formato BSON (JSON binário). Para Swift, usamos a biblioteca MongoKitten — uma biblioteca madura e ativamente suportada.