簡介
領域中使用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