摘要:由於在實習的工作中,采用的是 Go 語言,數據庫操作采用的 ORM 框架是 Gorm, 所以就來總結一下使用過程中遇到的一些問題。
基本操作
Save
當匹配主鍵的數據不存在時,它的效果是插入一條新數據,而當匹配的主鍵存在時,則更新全部字段。無論字段是否做了修改或者是定義類型的默認值。
package model const UserTable = "t_user" type User struct { Id int `gorm:"column:id; type:int(11);primary_key"` Name string `gorm:"column:name; type:varchar(32);"` Age int `gorm:"column:age; type:int(11);"` Description string `gorm:"column:description; type:varchar(512);"` } func (User) TableName() string { return UserTable }
note: 特別注意 Id 的定義中的 primary_key, 如果沒有加這個 Save 方法是無法正常工作的。
note: 如果在定義時,沒有給 Age 賦值,那么這條數據的 Age 將被置為 0。
note: 可以通過判斷傳入的主鍵字段是否為空來覺得是否要將此字段加入到結構體中,如果不為空,加入結構體,此時:找到則更新;如果為空,則會新建。
用處:不用顯示判斷是新增數據還是更新數據,可以讓代碼更加簡潔。
func (User) SaveOne(db *gorm) { user := User{Id:1, Name:"Tom", Age:18, Description:"A Man"} if err := db.Save(&user).Error; err != nil { fmt.Errorf("Save user failed, err: %+v\n", err) return } } // id 為主鍵 // 當記錄不存在時,執行的 Sql 語句是: insert into t_user(id, name, age, description) value (1, "Tom", 18, "A Man") // 當記錄存在時,執行的 Sql 語句是: update t_user set name = "Tom", age = 18, description = "A Man" where id = 1
Where
Gorm 的一個非常好用的特征就是鏈式查詢,在不同條件下需要有不同的查詢條件這樣的場景中,利用該特征能幫助我們大大簡化代碼。
func (User) FindQuery(query *gorm.DB, installId, appId string) *gorm.DB { query = query.Where("install_id = ?", installId) if appId != "" { query = query.Where("app_id = ?", appId) } return query }
參考資料:
https://juejin.im/post/5d29988e6fb9a07efc49b612