GORM的使用 | 青训营

116 阅读3分钟

GORM介绍

  • GORM是go语言流行的ORM框架
  • GORM支持的数据库:MySql、SQLServer、PostgreSQL、SQLite,通过驱动来连接数据库
  • 按照规范来使用GORM,可以天然地防sql注入

ORM (对象关系映射)框架是一种将数据库和对象之间进行映射的技术。 它将数据库表的结构和数据映射到对象模型中,使开发人员可以使用面向对象的方式来操作数据库,而不需要直接编写SQL查询语句。

GORM的使用

GORM连接数据库

image.png

  • DSN 是 "Data Source Name" 的缩写,它是一种连接数据库或其他数据源的格式化字符串。DSN 包含了连接数据库所需的一些信息,如数据库的地址、用户名、密码、端口号等用于标识要连接的数据库
  • &gorm.Config{}可以配置数据库连接的一些选项

GORM创建数据库表

type User struct {
	Id              int64  `json:"id" gorm:"column:id"`
	Name            string `json:"name" gorm:"column:name"`
	Password        string `json:"-" gorm:"column:password"`
	Avatar          string `json:"avatar" gorm:"column:avatar"`
	BackgroundImage string `json:"background_image" gorm:"column:background_image"`
	Signature       string `json:"signature" gorm:"column:signature"`
	FollowCount     int64  `json:"follow_count" gorm:"default:0"`
	FollowerCount   int64  `json:"follower_count" gorm:"default:0"`
	IsFollow        bool   `json:"is_follow" gorm:"-"`
	TotalFavorited  string `json:"total_favorited" gorm:"default:0"`
	WorkCount       int64  `json:"work_count" gorm:"default:0"`
	FavoriteCount   int64  `json:"favorite_count" gorm:"default:0"`
}
gorm.DB.AutoMigrate(&User{})
  • GORM可以通过结构体自动创建相应的数据库表,只需定义好相应的结构体,使用gorm.DB.AutoMigrate()加载该结构体即可
  • 通过gorm标签可以配置数据库表字段的一些属性
  • gorm.Model是 GORM 提供的一个内嵌结构体,用于为模型结构体(即数据库表的映射结构)添加一些常用的字段,以及内置的一些 CRUD 方法。包含IDCreatedAtUpdatedAtDeletedAt

GORM创建数据

user := &User{}
db.Create(user)
user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数
  • 使用create来创建记录
  • 可以使用 Create() 创建多项记录(传入结构体数组)
  • 可以在结构体定义时使用`gorm: default :XXX`标签来为记录字段定义默认值

GORM查询数据

// 获取第一条记录(主键升序)  
db.First(&user)  
// SELECT * FROM users ORDER BY id LIMIT 1;  
  
// 获取一条记录,没有指定排序字段  
db.Take(&user)  
// SELECT * FROM users LIMIT 1;  
  
// 获取最后一条记录(主键降序)  
db.Last(&user)  
// SELECT * FROM users ORDER BY id DESC LIMIT 1;  
  
result := db.First(&user)  
result.RowsAffected // 返回找到的记录数  
result.Error // returns error or nil  
  
// 检查 ErrRecordNotFound 错误  
errors.Is(result.Error, gorm.ErrRecordNotFound)
  • 使用First查询,需要注意查询不到数据会返回ErrRecordNotFound
  • 使用Find查询,可以查询多条数据,查询不到数据返回空数组
  • 当使用结构体作为查询条件时,GORM会忽略零值字段

GORM更新数据

// Update with conditions 
db.Model(&User{}).Where("active = ?", true).Update("name", "hello") 
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;  

// User's ID is `111`: 
db.Model(&user).Update("name", "hello") 
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;  

// Update with conditions and model 
value db.Model(&user).Where("active = ?", true).Update("name", "hello") 
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
  • Model(&user):找到对应数据库的表名
  • 使用Struct 更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select 选择字段。

GORM删除数据

// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;

// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
  • 如果模型包含了 gorm.DeletedAt字段(该字段也被包含在gorm.Model中),那么该模型将会自动获得软删除的能力,当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。
  • 如果并不想嵌套gorm.Model,也可以像这样开启软删除特性:Deleted `gorm.DeletedAt`

GORM事务

image.png

  • 容易漏写Rollback和Commit

image.png

参考链接