Vamos falar sobre GORM em Golang.
O que é o GORM?
GORM é uma biblioteca de ORM (Object-Relational Mapping) para a linguagem Go, projetada para simplificar interações com bancos de dados relacionais como MySQL, PostgreSQL e SQLite. Ela permite mapear structs Go diretamente para tabelas de banco, oferecendo recursos como automigração, consultas avançadas (eager loading), soft deletes e relacionamentos (belongs-to, has-one, has-many, many-to-many). É amplamente usada para reduzir boilerplate em aplicações Go que precisam de acesso a dados estruturados.
Por que a comunidade não usa ele?
Alguns desenvolvedores evitam usá-lo devido a preocupações com performance (devido ao overhead de reflexão e abstração), complexidade em queries avançadas ou preferência por alternativas mais leves como database/sql com sqlx para controle direto sobre SQL. Para projetos simples ou de alta performance, muitos optam por SQL puro ou outras bibliotecas para evitar dependências desnecessárias.
Como criar tabela no banco Postgres e salvar dados:
Como criar múltiplos registros:
Como alterar um registro já existente na tabela:
Agora vamos ver como deletar um registro na tabela:
Como buscar item na tabela utilizando o WHERE,FIND e FIRST:
O GORM também trabalha com soft delete. Soft delete é uma técnica em bancos de dados onde, em vez de excluir permanentemente um registro (hard delete), você marca o registro como “deletado” usando um campo especial, como deleted_at (timestamp). Isso permite recuperar o registro posteriormente se necessário, mantendo a integridade dos dados e evitando perdas irreversíveis. Também é incluído created_at e updated_at:
Se criarmos um registro ele vai retornar com created_at e updated_at atualizados com timestamp. Caso atualizarmo um registro ele vai atualizar só o updated_at. E se removemos um registro ele atualiza o deleted_at:
Para utilizar o soft delete é só adicionar na struct o gorm.Model se o ID for um inteiro incremente mas, no nosso caso nossa chave primária é um UUID então utilizamos os seguintes comandos na struct:
Agora chegou um ponto dos relacionamentos: belong-to, Has-one, Has-many e Many-to-Many. Para fazer trazer o relacionamento a gente faz chamada do Preload(“tabela de que está sendo relacionada na struct”). Não esquecer de adicionar um campo de ID do relacionamento na struct.
Belong-to(Pertence a)
- Relacionamento um-para-um onde o modelo atual tem uma chave estrangeira para outro modelo.
Has-One (Tem um)
- Relacionamento um-para-um onde o outro modelo tem uma chave estrangeira para este modelo.
Has Many (Tem muitos):
- Relacionamento um-para-muitos onde o outro modelo tem uma chave estrangeira para este modelo.
Neste exemplo nos mudamos Preload um pouco. Para preloads mais profundos, use pontos adicionais (ex.: “Products.Warranty.Details”).
Many-to-Many (Muitos-para-muitos):
- Relacionamento muitos-para-muitos usando uma tabela de junção
Neste exemplo adicionamos a uma anotação da tabela que vai habitar nossa relação exemplo: gorm:”many2many:products_categories;”
Chegamos ao ponto de falar de LOCK(Pessimista e Otimista).
Lock(Bloqueo) Pessimista vs Otimiista (Problemas com concorrência)
- Otimista: ele versiona quando alguém está fazendo operações
- Pessimista: ele bloqueia o campo para fazer alteração
0 comentários