GORM实现|青训营

70 阅读3分钟

GORM介绍

GORM(Go Object Relational Mapping)是一个用于在 Go 语言中进行数据库操作的强大框架。它提供了一种便捷的方式来进行数据库的增、删、改、查等操作,同时也支持复杂的查询和关联操作,极大地简化了与数据库的交互。

GORM安装配置

首先使用下面指令下载

go get -u gorm.io/gorm

将其连接好自己本地的数据

import (  
"gorm.io/driver/mysql"  
"gorm.io/gorm"  
"math/rand"  
"time"  
)  
  
  
func main() {  
dsn := "username:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"  
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})  
if err != nil {  
panic("Failed to connect to database")  
}

创建数据结构体

type User struct {  
ID uint `gorm:"primaryKey"`  
Username string  
Age int  
Email string  
CreatedAt time.Time  
}

其实在orm当中如果结构体当中没有声明谁是主键,在建表时默认会将ID设置为主键。

创建数据

user := User{Username: "john_doe", Age: rand.Intn(100), Email: "john@example.com"}  
db.Create(&user)

在创建数据时要是我们希望采用默认值可以在定义结构体时使用default,我在年龄构建时不想使用默认的,而是将其直接让其在100以内取一个随机数。

ORM的查询实现

func queryUserbyId(db *gorm.DB, Id string) {  
var user User  
result := db.First(&user, "ID = ?", Id)  
if result.Error != nil {  
fmt.Printf("User %s not found\n", Id)  
} else {  
fmt.Printf("User ID: %d, Username: %s, Email: %s\n", user.ID, user.Username, user.Email)  
}  
}

该函数将接收的ID作为条件查询,其对应的sql为select * from users where ID='' 也可以使用FIND进行查询操作:

func queryUserlikename(db *gorm.DB, username string) ([]User, error) {  
var users []User  
result := db.Where("username LIKE ?", username).Find(&users)  
if result.Error != nil {  
fmt.Printf("User %s not found\n", username)  
}  
return users, nil  
  
}

该函数所表达的表达式是select * from users where username like''注意,First在使用时查询不到数据会返回ErrRecordNotFound。但是使用Find查询多条数据时要是查询不到数据不会返回错误,所以我们自己对于错误进行处理。还有就是在使用结构体作为条件时,GORM只会查询非零字段,如果有非零字段,这些字段不会被用于结构查询,这时就需要使用Map进行构建查询条件。

ORM修改数据

func (u *User) updatebyonce(db *gorm.DB, Id string, username string) error {  
res := db.Model(u).Where("id =? ", Id).Updates(map[string]interface{}{"username": username})  
if res.Error != nil {  
return res.Error  
}  
return nil  
  
}

该函数的含义操作是update users set username = ? where id =?也可以进行表达式的更新:

db.Model(user).Update("CreatedAt", gorm.Expr("age * ? + ?", 2, 10))

但是使用Struct更新时,指挥更新非零值,要是需要更新零值,要使用MAP更新或者使用Select选择字段。

ORM实现删除

物理删除

db.Delete(&user, "1") //delete from users where id=1  
db.Delete(&user, []int{1, 2, 3})// delete from users where id in(1,2,3)  
db.Where("username like ?", "%jone%").Delete(user) //delete from users where username like %jone%  
db.Delete(&user, "username like ?", "%jone%")

软删除

软删除其实就是使用ORM在结构体当中加上DeletedAt

type User struct {  
ID uint `gorm:"primaryKey"`  
Username string  
Age int  
Email string  
CreatedAt time.Time  
Deleted gorm.DeletedAt  
}

当删除数据时,并非直接将数据进行物理抹除,而是在delete字段上进行操作添加上删除时间,而在使用DeletedAt的结构体时,ORM的查询会自动过滤掉delete字段有值的数据,但是如果我们结构体当中没有使用DeletedAt,那么查询还是会返回已经被软删除的数据,而且直接在数据库当中查询删除的数据还是可以被查看到的。 image.png