Golang下基於XORM的mysql使用

在golang中要實現對數據庫的操作, 一個比較好用的方式就是使用XORM,xorm是一個簡單而強大的Go語言ORM庫,通過它可以使數據庫操作非常簡便。 在xorm裏面,可以同時存在多個ORM引擎,一個ORM引擎稱爲Engine,一個Engine一般只對應一個數據庫。

golang的連接池配置

這裏初始化一個全局的xorm.Engine對象, xorm.Engine通過調用xorm.NewEngine生成在很多其他的API都需要傳入該對象作爲參數。 這裏需要理解這裏設定的3個參數的意義:

  • SetMaxIdleConns()
    設置連接池中的保持連接的最大連接數。默認也是0,表示連接池不會保持釋放會連接池中的連接的連接狀態:即當連接釋放回到連接池的時候,連接將會被關閉。這會導致連接再連接池中頻繁的關閉和創建。
  • SetMaxOpenConns()
    設置打開數據庫的最大連接數,包含正在使用的連接和連接池的連接。如果你的函數調用需要申請一個連接,並且連接池已經沒有了連接或者連接數達到了最大連接數。此時的函數調用將會被block,直到有可用的連接纔會返回。設置這個值可以避免併發太高導致連接mysql出現too many connections的錯誤。該函數的默認設置是0,表示無限制。
  • SetConnMaxLifetime
    設置連接可以被使用的最長有效時間,如果過期,連接將被拒絕。
import (
	    "github.com/go-xorm/xorm"
)
type DBClient struct {
	      Engine *xorm.Engine
}
func NewDbClient(dbUrl string, dbMaxConns int, dbMaxIdleConns int, dbMaxOpenConns int) *DBClient {
	    dbClient.Engine, err := xorm.NewEngine("mysql", dbUrl)
	   dbClient.Engine.SetMaxConns(dbMaxConns)
	   dbClient.Engine.SetMaxIdleConns(dbMaxIdleConns)
	   dbClient.Engine.SetMaxOpenConns(dbMaxOpenConns)
	   return dbClient
}

事務的使用

// 事務處理
      sess:= engine.NewSession()
      defer sess.Close()
      if err := sess.Begin() ; err != nil {
             return errors.New("Fail to session begin")
      }
      if _, err := sess.Id(id1).Cols("blance").Update(account_1) ; err != nil {
             sess.Rollback()
             return errors.New("fail to update 1")
      }
      return sess.Commit()

update操作更新爲default值

更新數據使用Update方法,Update方法的第一個參數爲需要更新的內容,可以爲一個結構體指針或者一個Map[string]interface{}類型。當傳入的爲結構體指針時,只有非空和0的field纔會被作爲更新的字段。當傳入的爲Map類型時,key爲數據庫Column的名字,value爲要更新的內容。

user := new(User)
user.Name = “myname”
user.Age = 0
affected, err := engine.Id(id).Update(user)

這裏需要注意,Update會自動從user結構體中提取非0和非nil得值作爲需要更新的內容,因此,這裏只有Name被更新, Age字段是不會被更新的, 如果需要更新Age值爲0,則此種方法將無法實現,因此有兩種選擇:

  • 通過添加Cols函數指定需要更新結構體中的哪些值,未指定的將不更新,指定了的即使爲0也會更新。
affected, err := engine.Id(id).Cols("age").Update(&user)
  • 通過傳入map[string]interface{}來進行更新,但這時需要額外指定更新到哪個表,因爲通過map是無法自動檢測更新哪個表的。
affected, err := engine.Table(new(User)).Id(id).Update(map[string]interface{}{"age":0})

參考資料

常用的操作:
https://github.com/lunny/xorm/blob/master/docs/QuickStartEn.md#6更新數據

文檔鏈接:
http://xorm.io/docs/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章