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,那么查询还是会返回已经被软删除的数据,而且直接在数据库当中查询删除的数据还是可以被查看到的。