gorm中执行Take和Last方法,为什么会查询出同一条数据呢?

在学习gorm时,学习到了单表的查询,但是发现一个问题,在使用Take方法之后查询出的是数据库中的第一条数据,我以为我再执行Last方法就会查询出最后一条数据,但是事实并非如此

1.首先创建一个Student表

type Student struct {
	ID     uint   `gorm:"size:3"`
	Name   string `gorm:"size:8"`
	Age    int    `gorm:"size:3"`
	Gender bool
	Email  *string `gorm:"size:32"`
}

2.我们使用gorm提供的方法进行创建表,并插入两条数据

//创建Student表
DB.AutoMigrate(&Student{})

//创建数据
email := "xxx@qq.com"
	s1 := Student{
		Name:   "cxywz1",
		Age:    21,
		Gender: true,
		Email:  &email,
	}

	s2 := Student{
		Name:   "cxywz2",
		Age:    23,
		Gender: true,
		Email:  &email,
	}
	err := DB.Create(&s1).Error
	err = DB.Create(&s2).Error
	fmt.Println(err)

此时数据库中有两条数据

这时我执行Take和Last方法

var student Student

	DB.Take(&student)
	fmt.Println(student)

	DB.Last(&student)
	fmt.Println(student)

可以看出来查询的是同一条数据,按我的逻辑是Take查询出id为1的数据,Last查询出id为2的数据,这到底是为什么呢?细心的朋友应该发现了,在生成的日志中这两条sql语句

这个时候发现,第二条查询语句竟然带上了第一条的查询条件,id为1,那表中id=1的数据有且仅有第一条数据,所以查询出来是相同的数据


3.解决方法 

个人理解是在创建student对象执行Take语句后,查询的条件又存在student中,所以在使用student调用Last方法时,带上了第一次Take方法的查询条件,解决方法也很简单,可以执行完方法后对student重新赋值或者是执行Take和Last时调用不同的对象

    DB.Take(&student)
	fmt.Println(student)
    //重新赋值
	student = Student{}
	DB.Last(&student)
	fmt.Println(student)

这样可以查询到想要的数据

也可以创建两个对象

    var student1 Student
	var student2 Student

	DB.Take(&student1)
	fmt.Println(student1)
	DB.Last(&student2)
	fmt.Println(student2)

也是可以查询到的


具体为啥有没有大佬可以指点一下,初学gorm遇到的一些问题记录一下

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值