首頁 >後端開發 >Golang >對於沒有結果行的查詢,我應該使用「DB.exec()」還是 Go 中的準備語句?

對於沒有結果行的查詢,我應該使用「DB.exec()」還是 Go 中的準備語句?

Susan Sarandon
Susan Sarandon原創
2024-12-12 22:42:30400瀏覽

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

破解在Golang 中使用*DB.exec() 和準備語句的難題

簡介

領域中當中使用Go 和Postgresql進行資料庫操作時,一個揮之不去的問題出現了:為什麼要費心DB.exec() 或者當 Go 看起來自動建立它們時準備好的語句?本文深入研究了執行不返回行的操作的複雜性,並闡明了使用準備好的語句背後的基本原理。

為什麼要用 DB.exec()

雖然DB.Query() 確實如此,而且DB.exec() 可以互換使用來執行SQL 語句,它們的不同之處在於傳回的結果類型。 DB.exec() 提供受查詢影響的行數的見解,而 DB.Query() 傳回結果集。

例如,假設您希望執行 DELETE 語句並決定已刪除的行數。使用 DB.exec() 是首選方法:

res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now())
if err != nil {
    panic(err)
}

numDeleted, err := res.RowsAffected()
if err != nil {
    panic(err)
}
print(numDeleted)

或者,更麻煩的方法是使用 DB.Query() 並循環rows來計算它們:

rows, err := db.Query(`DELETE FROM my_table WHERE expires_at =  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)

此外,當查詢結果不相關並且你只需要執行它,DB.exec()提供了一個簡潔的解決方案:

if _, err := db.Exec(`<my_sql_query>`); err != nil {
    panic(err)
}

相反,在下列情況下省略傳回的DB.Rows值的關閉呼叫:使用DB.Query() 最終會因記憶體導致開啟連線過載

深入研究準備好的語句

雖然有人建議Go 自動準備好的語句,但現實似乎更微妙。 DB.Query() 的行為似乎取決於所使用的底層驅動程式。

儘管如此,準備與重複使用 DB.Stmt 可以提高頻繁執行的效能查詢。瀏覽 Postgresql 官方文檔,了解準備好的語句如何最佳化操作。

結論

理解DB.exec() 和Golang 中的預準備語句可幫助開發人員高效執行不返回行的操作,並在尋求效能最佳化時利用預準備語句的優勢。

以上是對於沒有結果行的查詢,我應該使用「DB.exec()」還是 Go 中的準備語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn