GORM是一个已经迭代10年+的功能强大的ORM框架,在字节内部被广泛使用。同时,GORM拥有非常丰富的开源扩展,支持读写分离等。
Gorm的默认约定:
①Gorm使用名为ID的字段作为主键
②使用结构体的蛇形负数作为表名
③字段名的蛇形作为列名
④使用CreatedAt、UpdatedAt字段作为创建、更新时间
下面我将使用GORM连接数据库并实现增删改查操作。
一、连接数据库
以下是使用GORM连接数据库的代码(GORM目前支持MySQL、SQLServer、PostgreSQL、SQLite这四个主流数据库,GORM通过驱动来连接数据库):
package main
import (
"fnt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Student struct{
ID uint 'gorm:"primarykey"'
Name string 'gorm:"column: name"'
Age int 'gorm:"column: user_id"'
}
func main() {
db, err := gorm.Open(
mysql.Open(dsn),
&gorm.Config{})
if err != nil {
panic("Failed to connect to database")
}
}
二、增删改查四操作
2.1 增加数据(Create)
stu := Student{Name: "Tom", Age:18}
db.Create(&stu)
注:上方代码为新增一条数据的方法。
在需要创建多条数据的时候,需要使用切片(即数组)的方法。
2.2 更新数据(Update)
-条件更新单个列
db.Model(&Student{}).Where("id = ?", 1).Update("name", "Sunny")
-更新多个列
db.Model(&Student{ID:1}).Updates(Student{Name: "Amy", Age: 20})//仅更新非零值字段
db.Model(&Student{ID:1}).Updates(map[string]interface{}{"Name": "Amy", "Age": 20, "actived": false})//此方法可以用来更新零值字段
注:①Updates支持传入一个结构体或map。
②使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。
2.3 查询数据(Read)
db.Where("Name = ?", "Amy").First(&student)//查询第一条匹配的记录
db.Where("Name = ? AND age <= ?", "Amy", "20").Find(&students)//AND查询
注:①First支持传进结构体,但注意一定要是指针,在使用First时,查询不到数据会返回ErrRecordNotFound。
②使用Find查询多条数据,查询不到数据不会返回错误。
③当使用结构体作为查询条件时,GORM只会查询非零值字段。这意味着如果字段值为0、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。
2.4 删除数据(Delete)
db.Delete(&Student{}, 17)
注:对于一条数据的删除,删除对象需要指定主键。
我们可以使用Unscoped永久性删除数据:
db.Unscoped().Where("name = ?","Tom").Delete(&Student{})
注:我们还可以使用Unscoped找到被软删除的数据。
通过对GORM库的学习,我们可以很容易地去连接数据库,并且在数据库中执行增删改查的四种操作,这可以大大提高开发的效率。