Introdução: Por que Go e bancos de dados são a combinação perfeita
Go (Golang) é uma linguagem compilada, estaticamente tipada, criada para alta performance e simplicidade de desenvolvimento. Uma das principais vantagens do Go é sua rica biblioteca padrão e ecossistema de drivers para trabalhar com bancos de dados. Neste artigo, vamos abordar como conectar e executar operações com dois dos sistemas de gerenciamento de banco de dados (SGBD) mais populares: o relacional PostgreSQL e o orientado a documentos MongoDB.
Vamos cobrir a instalação de drivers, a escrita de operações CRUD (Create, Read, Update, Delete) e as melhores práticas para cada tipo de banco de dados no contexto de aplicações Go.
1. Trabalhando com PostgreSQL em Go
PostgreSQL é um poderoso SGBD objeto-relacional de código aberto. Para trabalhar com ele em Go, existem vários drivers, mas os mais populares são lib/pq e pgx. pgx é mais moderno e performático, portanto, vamos utilizá-lo.
1.1. Instalação do driver
Instale o pacote pgx via go get:
go get github.com/jackc/pgx/v51.2. Conexão com o banco de dados
Vamos criar um arquivo main.go e estabelecer uma conexão com o PostgreSQL. Observe o uso do contexto (context.Background()) — este é um padrão comum em Go para gerenciar o tempo de vida das requisições.
package main
import ( "context" "fmt" "log"
"github.com/jackc/pgx/v5/pgxpool")
func main() { // String de conexão: postgres://username:password@host:port/dbname connString := "postgres://user:password@localhost:5432/mydb" // Cria um pool de conexões (recomendado para produção) pool, err := pgxpool.New(context.Background(), connString) if err != nil { log.Fatal("Falha ao criar pool de conexões:", err) } defer pool.Close() // Verifica a conexão err = pool.Ping(context.Background()) if err != nil { log.Fatal("Falha ao conectar ao banco de dados:", err) } fmt.Println("Conectado ao PostgreSQL com sucesso!")}1.3. Executando consultas SQL (CRUD)
Vamos considerar as operações básicas usando a tabela users como exemplo.
Criação da tabela (CREATE)
// Executando uma consulta DDL_, err = pool.Exec(context.Background(), ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT )`)if err != nil { log.Fatal("Erro ao criar tabela:", err)}Inserção de dados (INSERT)
// Inserção com retorno do IDvar userID interr = pool.QueryRow(context.Background(), "INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id", "Alexey", "alex@example.com", 30).Scan(&userID)if err != nil { log.Fatal("Erro na inserção:", err)}fmt.Printf("Usuário adicionado com ID: %d", userID)Leitura de dados (SELECT)
// Obtendo um único usuáriotype User struct { ID int Name string Email string Age int}
var user Usererr = pool.QueryRow(context.Background(), "SELECT id, name, email, age FROM users WHERE id = $1", 1). Scan(&user.ID, &user.Name, &user.Email, &user.Age)if err != nil { log.Fatal("Usuário não encontrado:", err)}fmt.Printf("Encontrado: %+v", user)Atualização e exclusão (UPDATE/DELETE)
// Atualização_, err = pool.Exec(context.Background(), "UPDATE users SET age = $1 WHERE id = $2", 31, 1)
// Exclusão_, err = pool.Exec(context.Background(), "DELETE FROM users WHERE id = $1", 1)2. Trabalhando com MongoDB em Go
MongoDB é o principal banco de dados NoSQL, armazenamento