在gorm中查询数据库
这是一个系列的文章,上一篇的地址:
现在我们来看看如何查询某一条数据。例如现在我想查询数据库中是否存在一个名为“灰太狼”的人,那么就可以这么写代码:
package main
import "fmt"
type Student struct {
ID uint `gorm:"size:10"`
Name string `gorm:"size:16"`
Age int `gorm:"size:3"`
Gender bool
Email *string `gorm:"size:128"`
}
func main() {
var student Student
err := DB.Take(&student, "name = ?", "灰太狼").Error
if err != nil {
fmt.Println(err)
} else {
fmt.Println(student.Email)
}
}
注意,上述的代码已经不在connection.go中了,我新开了一个文件,名叫SingleTable.go,上面的代码是写在SingleTable.go中的。现在目录结构看起来这样:
你可能想问,那么现在connection.go中的代码长啥样呢?长这样:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
var mysqlLogger logger.Interface
func init() {
username := "root"
password := "xhw200116long3"
host := "127.0.0.1"
port := 3306
Dbname := "gorm"
timeout := "10s"
//日志操作相关
mysqlLogger = logger.Default.LogMode(logger.Info)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//skip后面那个东西是跳过更新删除等,这样可以获得性能的提升
//官方文档:https://gorm.cn/docs/index.html
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true,
Logger: mysqlLogger,
})
//连接失败
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
//连接成功
DB = db
fmt.Println(DB)
}
你可能还想问,如何运行上面刚开始那个go文件呢,目前我只有一种办法:按住ctrl,然后同时选中connection.go和SingleTable.go,然后右键,再点击运行。
可以看到运行结果如下:
也就是说我们查到了这条数据,它是真实存在的。
所以现在问题来了,为什么这条数据存在呢?我甚至从来都没有向表中插入过数据啊!
有意思,其实我是插入过数据的,不过我忘记怎么写插入数据的代码了,各位看官不如自己慢慢去别处查吧。
开个玩笑,插入数据的代码如下:
package main
import "fmt"
type Student struct {
ID uint `gorm:"size:10"`
Name string `gorm:"size:16"`
Age int `gorm:"size:3"`
Gender bool
Email *string `gorm:"size:128"`
}
func main() {
email := "evaker9485@gmail.com"
var s1 = Student{
Name: "灰太狼",
Age: 24,
Gender: true,
Email: &email,
}
err := DB.Create(&s1).Error
if err != nil {
fmt.Println(err)
} else {
fmt.Println("插入数据成功!")
}
}
大功告成。
还记得我们最开始的查询方法吗?其实查询方法远不止那一种,还有很多,下面再列举至少一个:
func main() {
var student1 Student
var student2 Student
DB.First(&student1)
fmt.Println(student1)
DB.Last(&student2)
fmt.Println(student2)
}
注:这还是在SingleTable.go中,main函数以外的代码不变。
上述代码的运行结果:
还有一种查法,比如我按照名字去查(就是查是否存在这个名字):
func main() {
var student1 Student
err := DB.Take(&student1, "name = ?", "小福贵")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(student1)
}
}
也可以按照id来查:
func main() {
var student Student
student.ID = 5
DB.Take(&student)
fmt.Println(student)
}
如果输入了不合理的id值,肯定找不到,所以还能这么玩:
func main() {
var student Student
student.ID = 8
err := DB.Take(&student).Error
if err == gorm.ErrRecordNotFound {
fmt.Println("没有找到记录")
} else {
fmt.Println("其他原因")
}
}
另外还能查询多条记录,所以还能这么玩:
func main() {
var studentList []Student
DB.Find(&studentList)
for _, student := range studentList {
fmt.Println(student)
}
}
就把你表里面的数据全打印出来了。除此之外还可查看有多少行受影响:
func main() {
var studentList []Student
count := DB.Find(&studentList).RowsAffected
fmt.Printf("有%d受影响", count)
for _, student := range studentList {
fmt.Println(student)
}
}
而且啊而且,我们还能把数据库里的数据转成json格式输出:
func main() {
var studentList []Student
DB.Find(&studentList)
data, _ := json.Marshal(studentList)
fmt.Println(string(data))
}
就问你gorm腻不腻害!