Introdução ao trabalho com bancos de dados em Swift
Swift deixou há muito tempo de ser uma linguagem exclusivamente para desenvolvimento mobile. Com o surgimento de frameworks server-side, como Vapor e Kitura, Swift se tornou uma ferramenta completa para criar soluções backend. Um aspecto fundamental de qualquer sistema servidor é o trabalho com bancos de dados. Neste artigo, veremos como conectar e interagir com dois SGBDs populares: o relacional PostgreSQL e o orientado a documentos MongoDB. Você aprenderá quais bibliotecas usar, como configurar a conexão e realizar operações CRUD básicas em Swift puro.
PostgreSQL em Swift: configuração e operações básicas
PostgreSQL é um dos bancos de dados relacionais mais confiáveis. Para trabalhar com ele em Swift, existem várias bibliotecas, mas a mais popular é PostgresNIO — um driver assíncrono construído sobre SwiftNIO. Se você usa o framework Vapor, o trabalho com PostgreSQL é simplificado através do ORM Fluent.
Conexão ao PostgreSQL via PostgresNIO
Vamos começar instalando a dependência. No Package.swift, adicione:
// 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") ]) ])Exemplo de conexão e execução de uma consulta SELECT simples:
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)")}Trabalhando com Vapor Fluent (ORM)
Fluent fornece uma API de alto nível para trabalhar com PostgreSQL. O modelo de usuário ficará assim:
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 }}
// Criando um registrolet user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: req.db)
// Consultando todos os usuárioslet users = try await User.query(on: req.db).all()MongoDB em Swift: trabalhando com documentos
MongoDB é um banco de dados NoSQL que armazena dados no formato BSON (JSON binário). Para Swift, existe o driver oficial MongoSwift, desenvolvido pela MongoDB Inc. Ele suporta operações assíncronas e modo síncrono.
Instalação e conexão do MongoSwift
Adicione a dependência no 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") ])]Exemplo de conexão a um MongoDB local e inserção de um documento:
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")let db = client.db("mydatabase")let collection = db.collection("u