在学习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遇到的一些问题记录一下