Laboratório

- Configuração
- Exercício
- Tarefa
Pré-requisitos
PostgreSQL
instalado e rodando:
docker run -p 5432:5432 -e POSTGRES_PASSWORD=secret postgres
- Banco
mydb
criado:
psql -U postgres -c "CREATE DATABASE mydb;"
Configuração
- Use a estrutura do Módulo 08
lab6/
├── go.mod
├── cmd/
│ └── api/
│ ├── main.go
│ └── main_test.go
├── internal/
│ └── repo/
│ ├── memoria.go
│ ├── memoria_test.go
│ ├── postgres.go
│ └── postgres_test.go
├── models/
│ └── produto.go
└── migrations/
├── 202506120001_create_produtos.up.sql
└── 202506120001_create_produtos.down.sql
- Adicione as dependências necessárias:
go get gorm.io/gorm
go get gorm.io/driver/postgres
go get github.com/golang-migrate/migrate/v4
- Atualize o arquivo
go.mod
:
module github.com/seu-usuario/lab6
go 1.21
require (
github.com/gin-gonic/gin v1.10.0
github.com/go-playground/validator/v10 v10.22.0
github.com/google/uuid v1.6.0
gorm.io/driver/postgres v1.5.9
gorm.io/gorm v1.25.12
github.com/golang-migrate/migrate/v4 v4.17.1
)
Para download do código-fonte, clique aqui!
Persistir o CRUD em Banco Real (PostgreSQL)
Objetivo
Refatorar o CRUD do Módulo 08 para usar PostgreSQL
com GORM
, aplicar migrações com golang-migrate
, e implementar testes de integração.
Passo a passo
- Crie o arquivo
migrations/202506120001_create_produtos.up.sql
com o conteúdo:
CREATE TABLE produtos (
id UUID PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
preco DOUBLE PRECISION NOT NULL
);
- Crie o arquivo
migrations/202506120001_create_produtos.down.sql
com o conteúdo:
DROP TABLE produtos;
- Atualize o arquivo
models/produto.go
utilizando o código:
Carregando editor interativo...
- Crie o arquivo
internal/repo/postgres.go
com o conteúdo:
Carregando editor interativo...
- Atualize o arquivo
cmd/api/main.go
com o conteúdo:
Carregando editor interativo...
- Para realizar os testes de integração, crie o arquivo
internal/repo/postgres_test.go
utilizando o código:
Carregando editor interativo...
Execução
- Inicie o
PostgreSQL
(ex: via Docker):
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=secret postgres
psql -U postgres -c "CREATE DATABASE mydb;"
- Aplique migrações e execute a API:
go run cmd/api/main.go
- Teste com o comando curl:
curl -X POST http://localhost:8080/produtos -H "Content-Type: application/json" -d '{"nome":"Laptop","preco":999.99}'
curl http://localhost:8080/produtos
- Execute testes de integração com o comando:
go test ./internal/repo -v
Tarefa
- Adicione validação no
GORM
para garantir que o nome tenha no mínimo 3 caracteres. - Implemente um teste de integração para os endpoints da API usando
httptest
. - Use
golang-migrate
para adicionar uma nova coluna (ex:created_at
) à tabela produtos.
Saída esperada
Console
POST
- /produtos
{ "id": "", "nome": "Laptop", "preco": 999.99 }
GET
- /produtos
[{ "id": "", "nome": "Laptop", "preco": 999.99 }]
Logs JSON (exemplo)
{"time":"2025-06-12T01:20:00Z","level":"INFO","msg":"Migrações aplicadas"}
{"time":"2025-06-12T01:20:00Z","level":"INFO","msg":"Produto criado","id":"","nome":"Laptop","preco":999.99}
{"time":"2025-06-12T01:20:00Z","level":"INFO","msg":"Requisição processada","method":"POST","path":"/produtos","status":201,"duration":"1ms"}
Caso de uso prático
Este lab simula um backend de e-commerce com persistência em PostgreSQL
, migrações automatizadas e testes de integração, ideal para aplicações em produção.