在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腻不腻害!

posted @ 2023-02-04 22:30  EvanTheBoy  阅读(256)  评论(0编辑  收藏  举报