a diversas funcionalidades • Developer-friendly ◦ Foco na linguagem • Mecanismos que ajudam a mitigar problemas de segurança • Suporte a diferentes bases de dados <Todo mundo ama ORM>
de algumas funções. Por exemplo: o.db.First(book, bookID) // Gorm o.db.NewSelect().Model(book). Where("id=?",bookID).Scan(o.ctx) // Bun <Todo mundo odeia ORM>
SQL não é uma sub-linguagem • Falta de flexibilidade para atender queries complexas • A ferramenta de ORM também pode ser burlada <Todo mundo odeia ORM>
uma ferramenta de ORM em um projeto. • Escopo • Criticidade • Prazo de entrega • Volume de dados a serem processados <Então, o melhor ORM é não ter ORM?>
massa de dados • Apesar de queries serem simples, ainda precisavam ser escritas • Incertezas em relação a continuidade do produto <Historinha de quando usei o Gorm>
pgx ou lib/pq (Postgres)? • SQL builders e SQL-First ORMs, ex. squirrel, *bun • Code-first ORMs, ex. gorm, ent • Geradores de código Go a partir de queries SQL, ex. sqlc <Alternativas>
Server, e TiDB • Comunidade ativa e documentação abrangente • É uma biblioteca rica em features ◦ Bulk insert, auto migrations, hooks, transações & transações aninhadas, gerenciamento automático de campos como created_at, updated_at e deleted_at <Gorm>
ORM ◦ APIs que remetem a um SQL builder que lembram instruções SQL • Suporta PostgreSQL, MySQL, MSSQL e SQLite • Documentação clara e objetiva • Suporte a migrações versionadas, transações, bulk insert-delete-update, soft delete, debug, observabilidade • Sugere Cursor Pagination para Postgres e MySQL <Bun>
:= db.NewSelect(). ColumnExpr("region"). TableExpr("regional_sales"). Where("total_sales > (SELECT SUM(total_sales) / 10 FROM regional_sales)") var []items map[string]interface{} err := db.NewSelect(). With("regional_sales", regionalSales). With("top_regions", topRegions). ColumnExpr("region"). ColumnExpr("product"). ColumnExpr("SUM(quantity) AS product_units"). ColumnExpr("SUM(amount) AS product_sales"). TableExpr("orders"). Where("region IN (SELECT region FROM top_regions)"). GroupExpr("region"). GroupExpr("product"). Scan(ctx, &items) • O Bun também fornece as mesmas travas de updates globais e placeholders para evitar SQL injection. ⇠ Exemplo de query avançada <Bun>
• Code-first • Criado em 2019 por desenvolvedores do Meta ◦ Facebook > Linux Foundation • Código gerado a partir de schemas ◦ Fields = propriedades ou colunas ◦ Edges = relacionamentos <Ent>
MySQL/MariaDB, e SQLite • Nada de queries obscuras geradas em runtime • Suporta query lints customizáveis 📚Vale a pena ler: Criando uma API usando Go e sqlc - Elton Minetto <Sqlc>
um teste unitário! • Benchmarks e o pprof são essenciais na identificação e resolução de gargalos Não acredite em fanfics. Acredite em métricas! <Benchmarks>
insert sqlc: 6277 213470 ns/op 288 B/op 8 allocs/op raw: 4900 248244 ns/op 576 B/op 11 allocs/op ent: 6444 244678 ns/op 3928 B/op 91 allocs/op bun: 4496 263463 ns/op 5076 B/op 15 allocs/op pgx: 6474 198450 ns/op 304 B/op 9 allocs/op gorm: 5403 235059 ns/op 7351 B/op 101 allocs/op <Exemplo> • Regras do jogo antes de cada execução ◦ Base de dados sempre limpa ◦ Para avaliar update, delete e selects, o tempo de preparação da base é desconsiderado.
ser determinante a médio-longo prazo • Leia a documentação e experimente! • Cuidado benchmarks antigos • Utiliza ORM ao projeto, mas executa Raw Queries o tempo todo? Reflita! <Conclusão>