Golang 入門系列(十二)ORM框架gorm


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

為什么要使用orm? 為什么是gorm? gorm 跟其他框架有什么不一樣?這里就不在介紹了。直接講用法吧。

庫安裝

go get -u github.com/jinzhu/gorm

 

數據庫連接

db, err = gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/irisapp?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("連接數據庫失敗")
}

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

 

表定義

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
}

 

創建表

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

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

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

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

 

查詢

var product Product
db.First(&product, 1) // 查詢id為1的product
db.First(&product, "code = ?", "ik01001") // 查詢code為l1212的product

 


插入

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

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

 

更新

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

 

刪除

簡單對象刪除:

db.Delete(&product)

復雜條件的刪除:

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

 

事務

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
}

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

 

最后

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

 2. 由於空間已經滿了,完整代碼示例代碼下載,可以關注微信公眾號,下載完整代碼。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM