簡介
領域中當中使用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中文網其他相關文章!