Introdução: Por que Go e bancos de dados são a combinação ideal
\nGo (Golang) é uma linguagem compilada moderna, criada pelo Google. Suas principais vantagens são alta performance, simplicidade e suporte nativo a concorrência. Quando se trata de trabalhar com bancos de dados, Go oferece bibliotecas padrão poderosas e drivers de terceiros populares para qualquer SGBD.
\nNeste artigo, vamos abordar como conectar e realizar operações básicas com dois dos bancos de dados mais populares: o relacional PostgreSQL e o orientado a documentos MongoDB. O material é voltado para desenvolvedores iniciantes que já conhecem os fundamentos da sintaxe do Go.
\n\n1. Preparação do ambiente e instalação dos drivers
\nAntes de escrever código, certifique-se de ter o Go instalado (versão 1.21+). Para trabalhar com bancos de dados, precisaremos de drivers. Instale-os usando os comandos:
\ngo get github.com/lib/pq // para PostgreSQL\ngo get go.mongodb.org/mongo-driver // para MongoDB\nCertifique-se também de que os servidores de banco de dados correspondentes estejam em execução na sua máquina (localmente ou via Docker).
\n\n1.1. Estrutura do projeto
\nCrie um arquivo main.go. Toda a lógica será concentrada nele para simplificar. Em projetos reais, é recomendável dividir o código em pacotes.
2. Trabalhando com PostgreSQL em Go
\nPostgreSQL é um SGBD relacional poderoso. Para trabalhar com ele em Go, usamos o pacote database/sql e o driver lib/pq.
2.1. Conexão ao banco de dados
\nVamos criar uma função de conexão. A string de conexão (DSN) contém host, porta, nome de usuário e banco de dados.
\npackage main\n\nimport (\n "database/sql"\n "fmt"\n "log"\n\n _ "github.com/lib/pq"\n)\n\nfunc main() {\n connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable"\n db, err := sql.Open("postgres", connStr)\n if err != nil {\n log.Fatal("Erro de conexão:", err)\n }\n defer db.Close()\n\n // Verificando a conexão\n err = db.Ping()\n if err != nil {\n log.Fatal("Não foi possível estabelecer conexão:", err)\n }\n fmt.Println("Conectado ao PostgreSQL com sucesso!")\n}\nImportante: sql.Open não cria uma conexão real, apenas um pool. A conexão real ocorre na primeira requisição ou chamada a Ping().
2.2. Criação de tabela e inserção de dados
\nAgora vamos criar a tabela users e adicionar alguns registros.
// Criação da tabela\ncreateTable := `\nCREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(100) UNIQUE NOT NULL,\n age INT\n);`\n_, err = db.Exec(createTable)\nif err != nil {\n log.Fatal("Erro ao criar tabela:", err)\n}\n\n// Inserção de dados\ninsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3)`\n_, err = db.Exec(insert, "Ivan Petrov", "ivan@example.com", 30)\nif err != nil {\n log.Fatal("Erro ao inserir:", err)\n}\nfmt.Println("Dados adicionados")\nObserve o uso dos placeholders $1, $2 — isso protege contra injeção de SQL.
2.3. Leitura e atualização de dados
\nVamos executar uma consulta de seleção e atualizar a idade do usuário.
\n// Leitura de dados\nrows, err := db.Query("SELECT id, name, email, age FROM users")\nif err != nil {\n log.Fatal(err)\n}\ndefer rows.Close()\n\nfor rows.Next() {\n var id int\n var name, email string\n var age int\n err := rows.Scan(&id, &name, &email, &age)\n if err != nil {\n log.Fatal(err)\n }\n fmt.Printf("ID: %d, Nome: %s, Email: %s, Idade: %d\\n", id, name, email, age)\n}\n\n// Atualização\n_, err = db.Exec("UPDATE users SET age = $1 WHERE name = $2", 31, "Ivan Petrov")\nif err != nil {\n log.Fatal(err)\n}\nfmt.Println("Idade atualizada")\n\n