package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type S23 struct {
gorm.Model
Id uint64
Name string
Age uint64
}
func main() {
db, err := gorm.Open("mysql", "root:20030303@(localhost:3306)/db1?charset=utf8mb4&parseTime=true&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
db.AutoMigrate(&S23{})
//
//u2 := S23{Id: 1, Name: "moxumoxu", Age: 102}
//db.Create(&u2)
//
//u1 := S23{
// Id: 3,
// Name: "xoxoxox",
// Age: 939,
//}
//db.Create(&u1)
var obj S23
obj.Id = 3
//db.First(&obj) //使用这个隐式更新id会进行obj的id的指定
//obj.Name = "握手"
//obj.Id = 2
//obj.Age = 211
//db.Debug().Save(&obj) //当obj 主键没有指定的时候 这个操作执行的是insert
//
//db.Debug().Model(&obj).Update("name", "llo")
fmt.Println("Id is ", obj.Id)
//db.Model(&obj).Where("name=?", "握手").Update("name", "不握手")
m := map[string]interface{}{"name": "llo", "age": 11312}
db.Debug().Model(&obj).Updates(m) //不指定ID就将全体的对象更新为这个
/*
当使用map更新多个属性,只会更新其中有变化的属性 使用struct更新多个属性,只会更新其中有变化且为非零值的字段
*/
db.Debug().Model(&obj).Select("age").Update(m) //select是选择 Omit是排除 排除指定的字段更新其余的字段
//但是不知道为什么内嵌gorm.Model的时候会更新全部的字段
ans := db.Debug().Model(&obj).Where("Id=?", 3).UpdateColumn("age", 2000).RowsAffected //所以在进行update的时候
//最好使用where进行限制
fmt.Println("更新了 ", ans)
//让表中所有的用户的年龄在原来的基础上+2
db.Debug().Model(&obj).Update("age", gorm.Expr("age+?", 2))
}
删除操作
var obj = User{}
obj.Name="moxu"
db.Delete(&obj) //注意主键不能为空 主键为空会将所有内容的delete_option赋值 也就是软删除
所以指定非主键删除时 使用where进行指定 eg:
db.Where("name LIKE ?","%moxu%").Delete(User{})
db.Delete(User{},"name LIKE ?","moxu")
如果model有deleteAt 字段,自动获得软删除的功能,删除的时候将这个字段设置为当前被删除的时间
正常Where().Fund(&obj)查询会忽略被软删除的记录,常理之中,但是使用Unscoped方法可以查询被软删除的记录,db.Unscoped().Where().Find()
同理,使用db.Unscoped().Delete()物理删除数据
以上的软删除是基于gorm.module 如果不内嵌gorm.module,就不会存在软删除,而是直接的删除