gorm普通的增删改查

gorm普通的增删改查

创建

创建

  • 单独创建----db.Create(&模型)
  • 指定字段----在Create之前使用Select
  • 跳过字段----在Create之前使用Omit
  • 批量创建----db.Create(&[]模型)
type User struct {
	gorm.Model
	Name string
	Age  uint8 `gorm:"comment:年龄"`
}

func main() {
	db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{})

	db.AutoMigrate(&User{})

	user := User{
		Name: "wxf",
		Age:  20,
	}
	//单独创建
	db.Create(&user)
	//指定字段,只创建name字段
	db.Debug().Select("name").Create(&user)
	//跳过,忽略字段
	db.Debug().Omit("name").Create(&user)
	//批量创建
	sliU := make([]User, 0)
	db.Debug().Create(sliU)
	//返回一个*DB,这里面会返回错误,和影响的条数
	dbres := db.Debug().Create(sliU)
	fmt.Println(dbres.Error, dbres.RowsAffected)
}

查询

查询

  • 接收返回值的形式

    1. Map Map[string]interface{} []Map[string]interface{}
    2. 结构体
    3. 返回多条,用切片接收
  • 查询主键排序后的第一条 db.First

  • 查询第一条(不排序) db.Take

  • 查询主键排序后的最后一条 db.Last

  • 条件

    1. 主键索引
    2. String条件 where
    3. Struct Map(可以加入一个有内容的结构体作为条件,也可以使用一个key为数据库表字段的map)
    4. 内联条件 省略where,直接在得到结果的First等后面写条件
  • Select指定条件

  • join后续会写

First 和 Last 会根据主键排序,分别查询第一条和最后一条记录。 只有在目标 struct 是指针或者通过db.Model() 指定 model 时,该方法才有效。 此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。 例如:

result := make(map[string]interface{})
db.Model(&User{}).First(&result)
fmt.Println(result)

var result User
db.Model(&User{}).First(&result)
fmt.Println(result)

主键检索:

//主键检索
dbres:=db.Model(&User{}).First(&result,22)
errors.Is(dbres.Error,gorm.ErrRecordNotFound)

String条件

//Where
db.Model(&User{}).Where("name=?", "wxf").First(&result)
fmt.Println(result)

Struct & Map

//Struct & map
db.Model(&User{}).Where(User{Name: "wxf"}).First(&result)
db.Model(&User{}).Where(map[string]interface{}{"name":"wxf"}).First(&result)
fmt.Println(result)

内联条件并且返回多条

var result []User
db.Find(&result, "name=?", "wxf")
db.Find(&result, User{Name: "wxf"})
db.Find(&result, map[string]interface{}{"name": "wxf"})
fmt.Println(result)

Select指定字段,Omit同理

var result []User
db.Select("name").Where("name LIKE ?","%x%").Find(&result)

有时候一个User表中有100个字段,但是我只想要它的name和age字段,能否屏蔽别的字段呢?答案是可以的,但是因为UserInfo是我们定义的返回结构体,所以需要在Find前面指定是哪个表结构

type UserInfo struct {
	Name string
	Age  int
}
var userinfo []UserInfo
db.Model(&User{}).Find(&userinfo)
fmt.Println(userinfo)

更新

更新

  • update 更新一个字段
  • updates 更新多个字段
    1. map :使用 map 更新多个属性,只会更新其中有变化的属性
    2. struct :当通过 struct 更新时,GORM 只会更新非零字段
  • Save 无论如何都更新,包括零值

Save的批量更新

var users []User
dbres := db.Where("name = ?", "wxf").Find(&users)
for i := range users {
	users[i].Age = 21
}
dbres.Save(&users)

updates

var users User
db.Where("name=?", "wxf").First(&users).Updates(User{Name: "testWxf", Age: 18})

删除

删除

  • 用法同Find First等
  • 软删除:deleteat字段存在则会软删除
  • Unscoped():硬删除,忽略软删除进行查询
var user User
//存在delete at字段,软删除
db.Where("name=?", "wxf").First(&user).Delete(&user)
//硬删除,跳过delete at字段的约束
db.Unscoped().Where("name=?", "wxf").First(&user).Delete(&user)

原生SQL

SQL 构建器

var user User
var users []User
db.Raw("update users set name=?", "hhh").Scan(&user)
fmt.Println(user)
db.Raw("select * from users").Scan(&users)
fmt.Println(users)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cheems~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值