首頁 >後端開發 >Golang >關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包)

關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包)

藏色散人
藏色散人轉載
2020-09-18 09:15:025353瀏覽

下面由golang教學專欄跟大家介紹關於關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用比較(附網路抓包)  ,希望對需要的朋友有幫助!


關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) 附帶的database/sql 庫可以與任何關係資料庫進行對話. 為了抽象連結到資料庫以及管理連接池的一些底層複雜性, 暴露的APIs 比實際預期要多一點. 最終導致了一些關於如何使用這些APIs 的想像.

因此, 我將嘗試分析一下使用之前已知的主要API 的行為.

我在主機的一個虛擬機器(ubuntu) 和一個mysql 伺服器上運行的關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) 應用程式進行了實驗.

## Query tried: insert into items (name, price, description) values ('brownie',240,'sizzling')

查詢

每當我們進行

select 時都應該是始終使用db.Query, 並且我們絕不應該護理Query 返回的rows, 而應對其進行迭代(否則我們會洩露數據庫鏈接)

執行

Query(query) 將不使用準備好的語句(可參閱下面的wireshark 擷取內容)

    注意從客戶端到伺服器僅發送了1 個TCP 請求(減去登入)
  • 當迭代返回的rows 時連結將自動釋放回池中, 或則我們可以在完成之後明確調用rows.Close()
  • 用法— 
  • db.Query(“insert into items (name, price, description) values('brownie', 240, 'sizzling')”)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

##查看wireshark 捕獲(query)

執行#Query(queryTemplate, params) 將在幕後使用準備好的語句

  • 注意從客戶端向伺服器發送了3 個TCP 請求(減去登入)
  • 當迭代完返回的rows 時, 連結將自動釋放回池中, 或者我們可以在完成之後明確地呼叫rows.Close().
  • 用法— db.Query(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

#Query(query, params) 的wireshark 捕獲

Exec

每當我們想要執行insertupdatedelete 時都應該要永遠使用db.Exec

.

執行Exec(query)

不會使用預備語句, 因此對SQL Server 的TCP 呼叫更少
  • 注意從客戶端到伺服器只發送了1 個TCP 請求(減去登入)
  • 自動釋放連結回到池.
  • #用法— db.Exec(“insert into items (name, price, description ) values('brownie', 240, 'sizzling')”)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

Exec(query) 的wireshark 捕獲

#執行Exec(queryTemplate, params)

將在幕後使用預備語句, 因此對SQL Server 的TCP 呼叫會多一些.
  • 注意從客戶端向伺服器發送了3 個TCP請求(減去登入)
  • 釋放連結自動回到池.
  • 用法— #db.Exec(“insert into items (name, price, description) values(?,? ,?)”, “brownie”, 240, “sizzling”)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

Exec(query, params) 的wireshark 捕獲

#Prepare

僅當我們的程式要在開始時準備一次並在程式執行期間​​執行N 次時, 才應使用此方法.
  • 注意有從客戶端到服務端發送了2 個TCP 請求(不算登入)
  • 當我們不需要預備語句時我們需要明確關閉語句. 否則, 我們將無法釋放客戶端和伺服器上分配的資源!
  • 用法— stmt.Exec(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

關於關於關於關於關於關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包) SQL中的Query、Exec和Prepare使用對比(附網路抓包)

#Prepare(query) 的wireshark 捕獲

結論

#第一次使用sql 套件時, 我們遇到的主要困惑之一是, 即使我們沒有明確指示這樣做, 我們也不知道其在幕後創建了預備語句.###

希望上述內容可以闡述清楚, 我們應該何時使用預備語句以及如何規避它們.
Hopefully the points above clarify, when are prepared statements invoked and how we can avoid them.

以上是關於Go SQL中的Query、Exec和Prepare使用對比(附網路抓包)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除