Gorm学习使用心得| 青训营笔记

273 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。
Gorm的文档中的各种用法已经很详细了,地址在文章最下面已贴出,此文主要记述在学习使用过程中遇到的一些难点。

什么是ORM?

ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) ⽤于实现⾯向对象编程语⾔⾥不同类型系统的数据之间的转换。

它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的打交道,只要像平时操作对象一样操作它就可以了 。简而言之,使用ORM框架之后,我们不需要手写复杂麻烦的SQL语句去操作关系型数据库,可以快速的操作数据库,操作简洁易上手,大大的提升了开发效率。

Gorm的初步上手

在gorm中,表名默认就是结构体名称的复数,例如一个名为user的结构体在数据库中表名则为users,同时也可以通过方法或者db.Table("表名")自定义表名。

列名由两个单词组成,在数据库中默认转小写后用下划线链接,例如结构体中名为UserName的字段在数据库中字段名则为user_name

如果结构体有ID字段则默认ID字段为主键。另外,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体,可以将其嵌入到自己的结构体中。更加具体用法可以查看最下方的文档地址。

创建记录

首先定义结构体user:=User{……},然后使用db.Create()语句创建。通常在db.Create前使用自动迁移db.AutoMigrate(),它并不支持改变已有的字段类型或删除未被使用的字段,仅支持创建表、增加表中没有的字段和索引,用来创建表保护数据以确保插入成功。

_ = db.AutoMigrate(&user)//自动迁移
db.Create(&user)

查询记录

基本的查询用法不再给出,文档给出的会比我说的好多了= - =
在青训营大项目学习过程中遇到的一个问题,如果一个Video结构体中嵌套着另一个User结构体,如何在每次查询全体视频列表时,带上视频作者user的信息,是如何在查询video表的同时附带查找user表中的信息?
使用预加载,在video结构体中增加一个user_id外键,用来匹配在视频中的user结构体,在获取视频列表时,利用user_id来进行预加载,同时查询user信息并加载到作者用户信息。

//结构体定义
type Video struct {
	Id            int64  `json:"id,omitempty"`
	Author        User   `json:"author" gorm:"foreignkey:UserId"`
	PlayUrl       string `json:"play_url,omitempty"`
	CoverUrl      string `json:"cover_url,omitempty"`
	FavoriteCount int64  `json:"favorite_count" gorm:"force:force"`
	CommentCount  int64  `json:"comment_count" gorm:"force:force"`
	IsFavorite    bool   `json:"is_favorite"`
	UserId        int64  `gorm:"not null"`
	Titile        string `json:"title,omitempty"`
	CreateDate    int64  `gorm:"autoCreateTime"`
}
//查询语句
db.Preload("Author").Order("create_date desc").Find(&videos)

这样做就可以在查询视频列表时,带上作者user信息啦。

删除记录

这个很简单,db.Delete()语句就好了。

更新记录

使用更新语句时由于我的不细心,导致一度出现bug时,我甚至不知道是什么原因,到最后回头自己看文档时,才恍然大悟。这也让我明白了一定要仔细看文档。
最开始我是db.Updates()去更新点赞数,错误代码如下。

//根据video_id,增加对应的Video的点赞数
db.Debug().First(&videos, "id =?",videoid).Updates(Video{FavoriteCount:videos.FavoriteCount + 1})
//根据video_id,减少对应的Video的点赞数
db.Debug().First(&videos, "id=?", videoid).Updates(Video{FavoriteCount:videos.FavoriteCount - 1})

然后再测试的时候发现,如果一开始数据为0,点赞之后数据加1没问题,但当取消点赞时,数据并没有减1变为0而是依然为1。但是其他数据加减就是正常的,让我百思不得其解,到最后回头仔细阅读文档,才发现了这么一句话。

Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段 原来如此,原来减1后数据为0,使用db.Updates()不更新所以依然为1。后面改成了使用db.Update()语句更新,才没有问题。

//根据video_id,增加对应的Video的点赞数
db.First(&video, "id = ?", videoid).Update("favorite_count", video.FavoriteCount+1)
//根据video_id,减少对应的Video的点赞数
db.First(&video, "id = ?", videoid).Update("favorite_count", video.FavoriteCount-1)

总结

在学习使用的过程中,由于自己粗心大意,出现了很多问题。不过这也让我明白了一件事,一旦有问题,一旦要多看文档,多看文档,多看文档!!

学习使用到的文档地址

Gorm指南
Go语言中文文档