GORM实践 | 青训营

226 阅读3分钟

GORM实践

:Golang现在用啥操作数据库?

:ORM呗

:ORM又是什么东西?

:后来很火的。

:那为啥叫这名?

让我们来回答上面的问题,ORM其实就是Object Relational Mapping(对象关系映射),啥意思呢?关系这个词熟悉么?MySQL就是关系型数据库。那对象呢?在Golang中,就是New一个的那个对象呗hhhh 其实在实际运用中,就是创建一个和数据库字段对应的 struct 结构体。然后Mapping 映射这个词就更好理解了,说直白点,那就是一一对应嘛!

总结上面的内容 ORM就是一个在面向对象语言内的一个对关系型数据库一一对应进行操作的工具。

Database/SQL

在Golang中,我们早期要操作数据库时,我们需要使用 database/sql这个包,并且需要定义dsn,dsn又是啥呢?data source name。简单来说就是你要连接数据库的信息,数据库驱动、数据库地址、账号密码、主机和端口、哪个数据库,这些都是我们需要再dsn中定义的信息。他才能通过driver去访问对应的具体数据库。例如:

dsn:=mysql://root:root@127.0.0.1:3306/atreus

这个就是一个非常好的例子,我们在实际的操作过程中少不了这个。然后接下来就是一通 DB.Connect、DB.Open、DB.Exec、DB.Close诸如此类的操作。

GORM

那既然有这种高科技了,咱们也得用上啊!就拿我们用的Golang来说吧,最常用的ORM就是GORM,名字也简洁明了,挺好理解。

那我们先来了解下GORM的设计原理吧,GORM的本质还是去操作database/sql,由这个原生的接口进行连接和操作数据库。

我们来看看GORM Statement

db.where("role <> ?",”manager“).Where("age > ?",35).Limit(100).Order("age desc").find(&user)

里面有 GORM Statement、Chain Method、GORM Clauses、 Finisher Method、Select Statement。下面我们来讲讲实现顺序:

GORM Statement 由若干个 Chain Method 和 Finisher Method 组成。

Chain Method:给 GORM Statement 添加 GORM Clauses 的方法。

GORM Clauses 都会用来生成最终的 SQL。

Finisher Method: 决定 Statement 最终的类型并且进行执行的方法。

Select Statement 的必备子句,橙色部分(SELECT、FROM)。

调用 Finisher Method 时,根据当前类型生成最终的 SQL。

实际项目中的实践

说了那么多,是骡子是马,拉出来溜溜。我们就在这次的大项目中来解决问题吧。例如这次我们用的是 Kratos 框架,Kratos很好的支持了 GORM,用起来也非常的方便,GORM的文档也非常的详细和简洁易懂。那么就用我这次负责的 Feed 流部分来给大家举一个例子吧.

首先先创建一个和DB对应的struct,用来存放从GORM传输过来的数据。

// Video DB model
type Video struct {
    Id            uint32 `gorm:"primary_key"`
    AuthorId      uint32 `gorm:"column:author_id;not null"`
    Title         string `gorm:"column:title;not null"`
    PlayURL       string `gorm:"column:play_url;not null"`
    CoverURL      string `gorm:"column:cover_url;not null"`
    FavoriteCount uint32 `gorm:"column:favorite_count;not null"`
    CommentCount  uint32 `gorm:"column:comment_count;not null"`
    // IsFavorite   s bool   // `json:"is_favorite"` // it field need to RPC. Want update.
    CreatedAt string `gorm:"column:created_at;default:''"`
    gorm.DeletedAt
}

然后再定义我们此次要查询的第表格名

func (Video) TableName() string {
    return "videos"
}

最后只需要通过GORM的方式去查询想要的内容

err:=r.data.db.
        Where("create_at <?", latestTime).
        Order("create_at DESC").
        Limit(VideoCount).
        Find(&vList).
        Error

即可通过这个命令查询,最后只需要把他保存到vList。后续就是常规的数据处理啦,他们该去哪给谁,就去哪。

总结

整体来说,ORM 或者说GORM是个非常好用的东西,甚至在第一次看到那个就这么简单的方法,让我都震惊了!对比起之前写过的Mybatis,这个才叫做ORM!也希望通过这次使用来更加熟悉GORM。