」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 對於沒有結果行的查詢,我應該使用「DB.exec()」還是 Go 中的準備語句?

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

發佈於2024-12-23
瀏覽:495

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 = $1`, time.Now())
if err != nil {
    panic(err)
}

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

或者,更麻煩的方法是使用DB.Query() 並循環遍歷行來對它們進行計數:

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)

此外,當查詢結果無關而只執行時,DB.exec()提供了一個簡潔的解決方案:

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

相反,在使用 DB.Query() 時忽略返回的 DB.Rows 值的關閉呼叫最終將導致打開連接過載由於記憶體洩漏。

深入研究準備好的語句

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

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

結論

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

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3