gorm数据库操作上:
package product
import (
"testing"
)
func TestGormOperation(t *testing.T) {
//以下都是一对多操作
//新增,无关联
//Product :=model.Product{}
//Product.Name = "超级大的滑雪场冬季必备"
//Product.Kind = "文娱旅游"
//
//common.Db.Set("gorm:save_associations", false).Create(&Product)
//新僧,有关联
//Product := model.Product{}
//Product.Name = "避暑的好地方"
//Product.Kind = "文娱旅游"
//Product.Attributes = []model.ProductAttribute{
// {Attribute: "地点", AttributeValue: "武汉"},
// {Attribute: "地点", AttributeValue: "成都"},
//}
//
//common.Db.Create(&Product)
//批量创建
//products := []model.Product{{Name: "宝马", Kind: "游戏", Attributes: []model.ProductAttribute{
// {Attribute: "大灯", AttributeValue: "LED"},
// {Attribute: "方向盘", AttributeValue: "真皮"},
//}}, {Name: "奔驰", Kind: "游戏", Attributes: []model.ProductAttribute{
// {Attribute: "大灯", AttributeValue: "LED"},
// {Attribute: "方向盘", AttributeValue: "真皮"},
//}}}
//
//common.Db.Create(&products)
//通过 CreateInBatches 限制批量插入的数量
//common.Db.CreateInBatches(&products, 50)
//products := []model.Product{{Name: "本田", Kind: "游戏", Attributes: []model.ProductAttribute{
// {Attribute: "大灯", AttributeValue: "LED"},
// {Attribute: "方向盘", AttributeValue: "真皮"},
//}}, {Name: "大众", Kind: "游戏", Attributes: []model.ProductAttribute{
// {Attribute: "大灯", AttributeValue: "LED"},
// {Attribute: "方向盘", AttributeValue: "真皮"},
//}}}
////Omit 忽略 某些字段(关联),这里直接 clause.Associations,忽略所有的关联
//common.Db.Omit(clause.Associations).Create(products)
//update with callbacks,这个更新操作将执行模型的BeforeUpdate, AfterUpdate方法,更新其UpdatedAt时间戳
//common.Db.Model(model.Product{}).Set("gorm:save_associations", false).Where("id = ?", 8).Updates(map[string]interface{}{"name":"避暑旅游打卡的好地方"})
//update,这个更新操作不会执行 callbacks相关的方法
//common.Db.Model(model.Product{}).Set("gorm:save_associations", false).Where("id = ?", 8).UpdateColumns(map[string]interface{}{"name": "避暑旅游打卡带娃野炊的好地方", "kind": "医疗健康"})
//update,这个更新操作不会执行 callbacks相关的方法,通过 Omit 忽略某些字段,不做更新
//common.Db.Model(model.Product{}).Set("gorm:save_associations", false).Where("id = ?", 8).Omit("name").UpdateColumns(map[string]interface{}{"name": "避暑旅游打卡带娃野炊的好地方", "kind": "医疗健康"})
//update,同时更新相关的关联模型,如果待更新内容不包含 关联模型字段,那么直接更新成功
//common.Db.Model(model.Product{}).Where("id = ?", 8).UpdateColumns(map[string]interface{}{"name": "避暑旅游团建的好地方", "kind": "健身运动"})
//关于更新有几个细节问题:①如果使用map的话可以更新任意结果,但是如果使用struct的话,如果待更新值为 "" 0 false,都不会被更新,下面的name值不会变
//common.Db.Model(model.Product{}).Where("id = ?", 8).UpdateColumns(model.Product{Name: "", Kind: "中医理疗"})
//name的值变为空
//common.Db.Model(model.Product{}).Where("id = ?", 8).UpdateColumns(map[string]interface{}{"name": "", "kind": "中医理疗"})
//带关联模型的 更新,我还没找到怎么更新关联关系...,下面这个肯定是不行的,因为没有关联关系数据的id
//product := model.Product{Name: "避暑旅游团建打卡的好地方", Kind: "健身运动", Attributes: []model.ProductAttribute{
// {Attribute: "大灯", AttributeValue: "LED"},
// {Attribute: "方向盘", AttributeValue: "真皮"},
//}}
//common.Db.Model(model.Product{}).Where("id = ?", 8).Save(product)
//删除操作,当数据库定义了 deleted_at,那么就会出发软删除操作(给deleted_at赋值)
//common.Db.Where("id = ?", 1).Delete(&model.Order{})
//Unscoped的用法,①可以用来硬删除数据 ②可以用来查询软删除的数据
//order := model.Order{}
//common.Db.Where("id = ?", 1).Unscoped().First(&order)
//fmt.Printf("order is:%+v\n", order)
//common.Db.Where("id = ?", 1).Unscoped().Delete(&model.Order{})
//验证 多对多 操作
//TODO::明天更新
}
