这是我参与「第五届青训营 」笔记创作活动的第4天
学习用文章:
数据库的引入:
数据库上主要使用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进行操作。
不过可以看出来,这种查询方式有很大的局限性,其中最大的问题就是不能指定查询数据库中的某个所属。为了解决这一缺点,我们来换一种查询方式:
修改/更新:
下面是使用“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
// 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()
}
如果在前面查询的那一步查询失败,就会在返回这样的结果: