后端数据库的基本操作|青训营

61 阅读6分钟

这是我参与「第五届青训营 」笔记创作活动的第4天

学习用文章:

blog.csdn.net/weixin_4661…

blog.csdn.net/qq_35709559…

数据库的引入:

数据库上主要使用gorm库,安装语句如下:

go get github.com/jinzhu/gorm

在vscode终端中输入上面一串代码后就成功安装了gorm库,下面我们在代码中连接上数据库:

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// 用户名:密码@tcp(ip:port)/数据库?charset=utf8mb4&parseTime=True&loc=Local
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
}

代码中“dsn:=”这一行是数据库句柄,“root:123456”意思是数据库登录名为root,密码为123456。“@tcp()”的意思是传值方式为tcp,后面为端口。“/yinlin”意为数据库名为yinlin。“charset=utf8mb4”为数据库接受utf-8mb4语言类型(这是唯一支持完全中文的格式)

下面来看看简单的数据库操作:

基本数据库操作:

新建:

下面展示了给数据库里新建数据的代码:

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int
	Name string
	Age  int
	Addr string
	File string
}

func main() {
	//数据库句柄
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败" + err.Error())
	}

	var user User

	db.AutoMigrate(&user)

	// 新建
	db.Create(&User{
		Name: "银琳",
		Age:  114,
		Addr: "中国",
		File: "main.go",
	})

	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()

}

Create的数据将会被新建到数据库里:

可以看到数据都放在对应的列下了

值得注意的是,在代码中“Name”“Age”等都是大写的,但是在数据库中却变成了小写。这是值得注意的一个点,后续调用数据库内的数据进行操作的时候也要注意大小写问题。不然会给你一个百思不得其解的报错。

重复运行代码后的数据库结果

值得注意的是数据库新建时并不会检索有无数据重复。所以你代码那边执行几次新建数据库就新建几次。

查找数据:

下面是简单查找数据库中数据的代码:

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int
	Name string
	Age  int
	Addr string
	File string
}

func main() {
	//数据库句柄
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败" + err.Error())
	}

	var user User

	db.AutoMigrate(&user)

	// 查
	db.First(&user)
	fmt.Println(user)

	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()
}

这个代码执行完毕后只会去查询数据库的第一数据,FIRST() 函数返回指定的字段中第一个记录的值。然后存到user里。随后在终端中打印出来查询结果。

那么,如果查询不到数据会有什么样的结果?

举个例子,下面这个就因为查询的查的是user,但是输出和db.AutoMigrate(自动迁移,简单来说就是保护数据)是对newuser进行操作。

这里是终端的输出结果

不过可以看出来,这种查询方式有很大的局限性,其中最大的问题就是不能指定查询数据库中的某个所属。为了解决这一缺点,我们来换一种查询方式:

Where查询,Where相当于一个定位的作用
这里提前新建好了几条数据
这里终端也输出了对应的信息

修改/更新:

下面是使用“Save”修改方式对数据库内容进行修改的代码。注意,任何修改方式都必须“先查后改”否则无法修改或更新。

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int
	Name string
	Age  int
	Addr string
	File string
}

func main() {
	//数据库句柄
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败" + err.Error())
	}

	var user User

	db.AutoMigrate(&user)

	// 查
	db.First(&user)
	fmt.Println(user)

	//改
	user.Name = "喵橘"
	db.Save(&user)
	fmt.Println(user) //注意,Save更新要修改一个数据必须先找后改。先找到这个数据然后才可以改

	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()
}

这里执行完代码后,会将数据库中第一个name下属的数据改成“喵橘”

但是用Save来更新修改数据有诸多不便,其中最大的不便就是Save会有限制不被允许的字段传入。无法一次性传输修改多个字段。

因此,在这里我们引入一种新的修改方式,update(s):

代码如下:

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int
	Name string
	Age  int
	Addr string
	File string
}

func main() {
	//数据库句柄
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败" + err.Error())
	}

	var user User

	db.AutoMigrate(&user)

	// 查
	db.First(&user, "name= ?", "银琳")
	fmt.Println(user)

	// update更新(单个语句)
	db.Model(&user).Update("Age", 18)

	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()
}

这里执行完毕后,会将一段数据的“Age”栏更新为18

可以看到id为2的那一栏的age已经变成了18
// Update - 更新多个字段(注意,这只会更改一条数据内的多个字段
	db.Model(&user).Updates(User{Name: "银琳", Age: 81, Addr: "earth"}) // 仅更新非零值字段,若里面的内容为零为空则报错。
	db.Model(&user).Updates(map[string]interface{}{"Name": "于庆峰", "Age": 40, "Addr": "信息院"})

上面那一串代码使用了updates,它可以更新一条语句中的多个字段

执行第一个语句后数据库的显示结果
执行第二条语句后数据库的结果

删除:

下面一串代码是先查,后改,再删的一个流程。执行完毕后会删除第一条数据:

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int
	Name string
	Age  int
	Addr string
	File string
}

func main() {
	//数据库句柄
	dsn := "root:123456@tcp(127.0.0.1:3306)/yinlin?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败" + err.Error())
	}

	var user User

	db.AutoMigrate(&user)

	// 查
	name := "王雪冬"
	db.Where("name= ?", name).First(&user)
	//db.First(&user)
	fmt.Println(user)

	// 改
	user.Name = "银琳"
	db.Save(&user)
	fmt.Println(user) //注意,Save更新要修改一个数据必须先找后改。先找到这个数据然后才可以改

	//删
	db.Delete(&user)

	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()
}

如果在前面查询的那一步查询失败,就会在返回这样的结果: