之前在已經介紹了用的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. 由於空間已經滿了,完整代碼示例代碼下載,可以關注微信公眾號,下載完整代碼。