Golang 入門系列(十一)orm框架之gorm詳細介紹!

之前在已經介紹了用的github.com/go-sql-driver/mysql 訪問數據庫,不清楚的朋友可以看看之前的文章 。實際上,為提高開發效率,一般都會使用一些orm框架,把數據庫層屏蔽,用戶看到的只有對象而無需我們手動做一些轉換,這樣在使用的時候就非常方便。這種操作方式基本上已經成了標準做法。golang也有很多優秀的orm框架,今天就來介紹介紹gorm。

為什麼要使用orm? gorm 跟其他框架有什麼不一樣?相信網上的文章已經講過很多次,這裡就不在介紹了。下面我就以普通的產品模塊為例,介紹一下 gorm 的用法,分享關注(章為忠學架構)獲取完整代碼。


庫安裝

<code>go get -u github.com/jinzhu/gorm/<code>

數據庫連接

首先創建數據庫連接

<code>

連接比較簡單,直接調用 gorm.Open 傳入數據庫地址即可。gorm支持基本上所有主流的關係數據庫,只是連接方式上略有不同,這裡我用的 mysql為例吧。

實體類

首先需要定義實體類,這個實體類包含變量名稱及對應的數據庫字段類型和長度。通過gorm的映射指定對應表的列

<code>type Product struct {
ID int `gorm:"primary_key"`

Code string `gorm:"type:varchar(20);"`
Price int `gorm:"type:int;"`
Name string `gorm:"type:varchar(64);"`
Mail string `gorm:"type:varchar(256);"`
CreatedAt time.Time
}/<code>

創建表

直接通過 db.CreateTable 就可以創建表了,非常方便,還可以通過 db.Set 設置一些額外的表屬性。

<code>if !db.HasTable(&Like{}) {
if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Product{}).Error; err != nil {
   panic(err)
}
}/<code>

另外,還有自動同步創建表的方法:

<code>// 自動遷移模式
db.AutoMigrate(&Product{})/<code>

查詢

如果簡單查詢當個記錄,可以使用 db.Find(&Likes) 或者只需要查一條記錄 db.First(&Like)。

複雜查詢也特別簡單,先用 db.Model() 選擇一個表,再用 db.Where() 構造查詢條件,後面可以使用 db.Count() 計算數量。

<code>// 簡單查詢
var product Product
db.First(&product, 1) // 查詢id為1的product
db.First(&product, "code = ?", "ik01001") // 查詢code為l1212的product
// 複雜查詢

var count int
err := db.Model(&Like{}).Where(&Product{code: "ik01001"}).Count(&count).Error
if err != nil {
return false, err
}/<code>

插入

構造已給對象,直接調用 db.Create() 就可以插入一條記錄。不用拼接sql語句,是不是很方便。

<code>// 創建
db.Create(&Product{Code: "ik01001", Price: 1000})/<code>

更新

<code>// 更新 - 更新product的price為2000
db.Model(&product).Update("Price", 2000)/<code>

第一個是更新單條記錄和對應的字段;第二個則是更新整條記錄,注意只有非空字段才會更新。


刪除

簡單對象刪除,直接創建一個對象即可:

<code>db.Delete(&product)/<code>

複雜條件的刪除,先用 db.Where() 構造查詢條件,再調用 db.Delete() 就可以刪除:

<code>if err := db.Where(&Product{ID: 1}).Delete(Product{}).Error; err != nil {
  return err

}/<code>


錯誤處理

其實你已經看到了,這裡基本上所有的函數都是鏈式的,全部都返回 db 對象,任何時候調用 db.Error 就能獲取到錯誤信息,非常方便。


事務

<code>func CreateProducts(db *gorm.DB) err {
  tx := db.Begin()
  // 注意,一旦你在一個事務中,使用tx作為數據庫句柄

  if err := tx.Create(&Product{Code: "ik01003", Price: 3000}).Error; err != nil {
    tx.Rollback()
    return err
  }

  tx.Commit()
  return nil
}/<code>

事務的處理也很簡單,用 db.Begin() 聲明開啟事務,結束的時候調用 tx.Commit(),異常的時候調用 tx.Rollback()。

最後

以上就把基本的增刪改查介紹完了,實際使用中還有很多高級的用法,比如關聯查詢,主外鍵設置等。大家可以看看官方的使用說明: http://gorm.book.jasperxu.com/ 。分享關注(章為忠學架構

)獲取完整代碼。



分享到:


相關文章: