前言
今天学习了一下在Hertz中加入gorm,一开始以为可能有什么特殊的手法,结果研究了一下官方文档好像就是简单的加入就可以了,大项目作业的第一接口是一个视频流,但是为了学习,我先实现了最简单的注册接口,也就是用到了gorm的创建和查询功能。本篇文章很大程度上参考了官方样例Hertz_gorm
观察
git下来官方的样例后,可以发现和之前hz搭建的脚手架是差不多的,最大的区别就是多了这些东西:
dal下其实存的就是mysql有关的东西,dal/mysql/init就是初始化数据库连接,也就是gorm的那个open dsn的操作,这个不会的先去了解一下gorm。然后user.go就是数据库层面的操作,怎么说可以理解成Springboot的那个Service层吧。/dal/init.go就是简单的调用一下init.go,猜测是为了其他包调用更方便把,不是很明白为什么要封装一层。
以及在model文件夹下多了这些:
这个user.sql文件我推测只是用来让读者明白表结构的,有没有在项目里都无所谓,user.go文件就是熟悉的带着gorm.model的结构体了。
我们可以自己另外创建一个项目,把表用gorm自动创建出来,自己去写还容易犯错不是:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
)
type User struct {
gorm.Model
Id int64 // 用户id
Name string // 用户名称
Passwd string //用户密码
FollowCount int64 // 关注总数
FollowerCount int64 // 粉丝总数
IsFollow bool // true-已关注,false-未关注
Avatar string //用户头像
BackgroundImage string //用户个人页顶部大图
Signature string //个人简介
TotalFavorited int64 //获赞数量
WorkCount int64 //作品数量
FavoriteCount int64 //点赞数量
}
var dsn = "root:aaa24331277@tcp(localhost:3306)/tiktok?charset=utf8&parseTime=True&loc=Local"
var DB *gorm.DB
func main() {
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true,
PrepareStmt: true,
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
panic(err)
}
err = DB.AutoMigrate(User{})
if err != nil {
log.Println("表迁移失败")
return
}
DB.Create(&User{
Name: "gorsonpy",
Passwd: "ggb",
})
}
有个细节,包里面的代码是不会自动执行的,也就是说我们的程序不会主动的去init好我们的数据库连接,那要咋办呢,很简单,在main函数里面调用init就可以了。
func main() {
dal.Init()
h := server.Default()
register(h)
h.Spin()
}
也就是dal.Init。
然后就是很简单的搬砖环节了,我们今天就简单实现一个注册环节,它只需要一个user结构体,然后实现数据库查询和添加就可以了,很简单。 首先仿照之前的操作,我们根据IDL文件创建出脚手架:
syntax = "proto3";
package user;
import "api.proto";
message douyin_user_register_request {
string username = 1; // 注册用户名,最长32个字符
string password = 2; // 密码,最长32个字符
}
message douyin_user_register_response {
int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
int64 user_id = 3; // 用户id
string token = 4; // 用户鉴权token
}
service registerService{
rpc registerMethod(douyin_user_register_request) returns(douyin_user_register_response){
option (api.post) = '/douyin/user/register';
}
}
然后去修改handler里面的逻辑,注册的逻辑很简单就不放代码了防止代码文字比太高。