"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Devo usar `DB.exec()` ou instruções preparadas em Go para consultas sem linhas de resultados?

Devo usar `DB.exec()` ou instruções preparadas em Go para consultas sem linhas de resultados?

Publicado em 23/12/2024
Navegar:891

Should I Use `DB.exec()` or Prepared Statements in Go for Queries Without Result Rows?

Decifrando o enigma do uso de *DB.exec() e declarações preparadas em Golang

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.

Tutorial mais recente Mais>

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