Trabalho com Bancos de Dados em Go: PostgreSQL e MongoDB para Iniciantes
Go (Golang) é uma linguagem compilada moderna que ganhou popularidade devido ao seu alto desempenho, simplicidade e suporte embutido para concorrência. Ao desenvolver serviços web e aplicações, surge quase sempre a necessidade de interagir com bancos de dados. Neste artigo, veremos como trabalhar com dois SGBDs populares: o relacional PostgreSQL e o orientado a documentos MongoDB. O material é voltado para desenvolvedores iniciantes que já conhecem os fundamentos do Go.
1. Preparação do Ambiente e Instalação dos Drivers
Antes de começar, certifique-se de que você tenha o Go instalado (versão 1.16+) e os SGBDs correspondentes em execução. Para trabalhar com PostgreSQL, será necessário o driver lib/pq, e para MongoDB, o driver oficial mongo-go-driver.
go get github.com/lib/pqgo get go.mongodb.org/mongo-driver/mongoCrie um novo módulo:
go mod init example.com/db-demo2. Trabalho com PostgreSQL em Go
PostgreSQL é um banco de dados relacional poderoso com suporte a SQL. Em Go, usamos o pacote padrão database/sql juntamente com o driver lib/pq.
2.1 Conexão ao Banco de Dados
Para conectar, é necessário especificar a string de conexão (DSN) no formato: host=... port=... user=... password=... dbname=... sslmode=disable.
package main
import ( "database/sql" "fmt" "log" _ "github.com/lib/pq")
func main() { connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { log.Fatal(err) } defer db.Close()
err = db.Ping() if err != nil { log.Fatal("Não foi possível conectar:", err) } fmt.Println("Conexão com PostgreSQL estabelecida!")}2.2 Criação de Tabela e Operações CRUD
Vamos considerar a criação da tabela users e a execução de operações básicas.
// Criação da tabelacreateTable := `CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT);`
_, err = db.Exec(createTable)if err != nil { log.Fatal(err)}
// Inserção de dadossqlInsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id`var userID interr = db.QueryRow(sqlInsert, "Ivan Petrov", "ivan@example.com", 30).Scan(&userID)if err != nil { log.Fatal(err)}fmt.Printf("Usuário adicionado com ID: %d", userID)
// Consulta de dadosrows, err := db.Query("SELECT id, name, email, age FROM users")if err != nil { log.Fatal(err)}defer rows.Close()
for rows.Next() { var u struct { ID int Name string Email string Age int } err := rows.Scan(&u.ID, &u.Name, &u.Email, &u.Age) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Nome: %s, Email: %s, Idade: %d", u.ID, u.Name, u.Email, u.Age)}2.3 Uso de Consultas Preparadas
Consultas preparadas (prepared statements) aumentam a segurança e o desempenho, especialmente em operações repetitivas.
stmt, err := db.Prepare("UPDATE users SET age = $1 WHERE id = $2")if err != nil { log.Fatal(err)}defer stmt.Close()
_, err = stmt.Exec(35, 1)if err != nil { log.Fatal(err)}fmt.Println("Idade do usuário atualizada")3. Trabalho com MongoDB em Go
MongoDB é um banco de dados NoSQL orientado a documentos. Em Go, o trabalho com ele é feito através do driver oficial mongo-go-driver, que usa contextos para gerenciar o tempo de execução das operações.
3.1 Conexão ao MongoDB
pa