这是我参与「第五届青训营 」伴学笔记创作活动的第六天。今天观看了录播课程,老师带我们学习了Go语言中的三个框架,他们分别是:Gorm、Kitex、Hertz。
Grom的基本使用
Gorm是一个迭代了10年以上的ORM框架,在字节内部被广泛使用并且拥有十分方法开源拓展。引入Gorm的依赖后我们接就可以开始使用了,首先我们要定义结构体来映射数据库中的表,同时也可以为结构体实现TableName方法返回我们想要映射的表名,如果不实现该函数,默认使用结构体蛇形命名的复数作为表名,同时我们还可以使用grom的tag来给结构体的属性做字段名的映射,话可以用来声明主键等。Grom框架规定我们给结构体添加CreateedAt和UpdatedAt属性,来记录创建和修改时间。做完这些准备工作后我们就可以真正的开始使用Grom了。
连接数据库
Gorm目前支持大部分的主流数据库,例如Mysql,SQLServer、SQLLite等,以mysql为例,首先我们要先构建Mysql的dsn,格式为user:psw@tcp(127.0.0.1:3360)/dbname,然后将dsn作为参数传如mysql.open()方法中,之后将该方法的返回值传入gorm.open()中即可获得连接对象和抛出的错误,注意不要忘记对返回的错误做处理!
新增数据
我们可以调用代db.create()方法将我们创建的对象插入到数据库中,同时我们还可以传入一个集合来做到批量插入。当我们遇到唯一约束冲突时我们可以使用db.Clause.OnConflict(clause.OnConflict{DoNothing:true}).Create()方法来跳过冲突语句。
查询数据
我们使用db.First()方法来查询一条数据,或者db.Find()方法来查询一批数据,由于db对象的方法支持链式编程,所以在这两个方法前可以插入Where方法来添加查询条件,where方法的参数可以是字符串,对象或者map,需要注意的是使用First方法时如果没有查询到符合条件的结果会返回ErrRecordNotFind错误,而find方法则会返回空集合,并不会返回错误,同时如果我们使用结构体对象作为条件传入where方法时框架会忽略值为零的条件,导致我们的结构不符合预期,这时候可以使用Map来替代对象来作为条件传入。
更新数据
我们可以使用db.Model().update()方法,我们可以在MOdel()方法中传入我们创建的结构体对象,为更新方法确定目标表,还可以给对象的属性赋值,作为备选条件使用,也可以在update()方法之前传入Select()方法传入想要更显的字段,需要注意的是,Update()方法同时存在忽略零值的情况,如果想要使用零值可以用map替换。
删除数据
我们可以使用bd.Delete()方法来删除目标数据,我们需要传入创建的结构体对象或者指针来指明操作的表,同时可以传入主键值,框架会帮我们删除与传入主键对应的数据,也可以在Delete()方法前插入Where()方法来指定删除条件。同时Gorm也提供了软删除策略,为我们的结构体添加类型为gorm.DeleteAt的属性即为开启软删除,开启了软删除策略的Model在进行删除时不会将数据真正的在数据库里删除,通过普通的查询语句也查询不到被删除的数据,我们可以通过Unscoped()方法来查询以被删除的数据。
事务
Gorm提供了Begin、Commit、RollBack方法用于失事务,我们可以通过bd.Begin()方法来开启事务,并获得tx对象,之后可以使用tx.Commit()方法提交事务或者tx.RollBack()方法来回滚事务,同时Gorm为了避免程序员在写程序时忘记提交或者回滚提供了Tansaction方法用于自动提交事务。
Kitex的基本使用
Kitex目前对Windows的支持并不完善,所以需要借助虚拟机来使用。使用前我们需要使用DIL定义服务与接口,如果我们需要使用RPC就需要知道对方的接口是什么,需要什么参数和返回值是什么,这时候我们就需要IDL来约定双方的协议。Kitex服务默认监听8888端口,我们可以使用NewClient()方法来创建一个客户端,封装好请求后可以调用客户端的Echo()方法来发送请求,目前Kitex的服务发现和注册已经对接了主流的服务发现与注册中心,例如ZooKeeper、Nacos、ETCD等。
Hertz的基本使用
Hertz是字节开发的一款高性能HTTP框架。我们可以使用Server.Default()方法来监听某个端口,并返回一个对象,调用该对象的Get()方法可以注册一个Get方法的路由函数,Hertz提供了Get、Post、Put、Delete、ANY等方法用于注册路由函数,同时也提供了路由组的能力,用于支持路由分组的功能。路由的优先级为:静态路由>命名路由>通配路由。Hertz还提供了HTTP Client用于帮助用户发送请求,我们可以使用client.NewClient()方法来获得一个客户端对象,通过该对象调用get或者post方法传入路由即可发送请求获得响应和状态。