Introdução
No reino da manipulação de banco de dados usando Go e Postgresql, surge a questão persistente: por que se preocupar com DB.exec() ou instruções preparadas quando Go aparentemente automatiza seus criação? Este artigo investiga as complexidades da execução de operações que não retornam linhas e elucida a lógica por trás do uso de instruções preparadas.
Por que usar DB.exec()?
Embora seja verdade que DB.Query() e DB.exec() podem ser usados alternadamente para executar SQL declarações, elas diferem no tipo de resultado que retornam. DB.exec() fornece insights sobre o número de linhas afetadas pela consulta, enquanto DB.Query() retorna um conjunto de resultados.
Por exemplo, suponha você deseja executar uma instrução DELETE e verificar o número de linhas excluídas. Usar DB.exec() é a abordagem preferida:
res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = $1`, time.Now()) if err != nil { panic(err) } numDeleted, err := res.RowsAffected() if err != nil { panic(err) } print(numDeleted)
Alternativamente, a abordagem mais complicada envolveria o uso de DB.Query() e percorrer as linhas para contá-las:
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = $1 RETURNING *`, time.Now()) if err != nil { panic(err) } defer rows.Close() var numDeleted int for rows.Next() { numDeleted = 1 } if err := rows.Err(); err != nil { panic(err) } print(numDeleted)
Além disso, quando o resultado de uma consulta é irrelevante e você apenas precisa executá-lo, DB.exec() oferece uma solução concisa:
if _, err := db.Exec(``); err != nil { panic(err) }
Em contraste, deixar de fora a chamada de fechamento para o valor DB.Rows retornado ao usar DB.Query() eventualmente levará a uma sobrecarga de conexões abertas devido a vazamentos de memória.
Investigando as declarações preparadas
Embora tenha sido sugerido que Go crie automaticamente declarações preparadas, a realidade parece ser mais matizada. O comportamento de DB.Query() parece depender do driver subjacente que está sendo usado.
No entanto, preparar e reutilizar DB.Stmt pode melhorar o desempenho para execução frequente consultas. Uma olhada na documentação oficial do Postgresql revela como as instruções preparadas podem otimizar as operações.
Conclusão
Compreendendo as distinções entre DB.exec() e instruções preparadas em Golang ajudam os desenvolvedores a executar operações que não retornam linhas de forma eficiente e aproveitam os benefícios das instruções preparadas ao buscar otimizações de desempenho.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3