尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

kratos 框架编写一个小demo

kratos 框架编写一个小demo
📅 发布时间:2026/6/20 4:56:31

保证本机安装 kratos 的前提下, 创建一个模板

kratos new review-service -r https://gitee.com/go-kratos/kratos-layout.git

在 .gitignore中,添加如下一行,就可以把这个仓库,用自己的git托管了。(因为.pb.go文件,其实可以使用 make 生成,个人感觉,不需要使用git托管)

*.pb.go

新添加 proto 文件,到 api ,并根据 api 文件,创建对应的 service文件

kratos proto add api/review/review.proto
make api
kratos proto server api/review/review.proto -t internal/service

结果如下图所示:
image

数据库

设计数据库并使用 ORM 自动生成数据库

在生产环境,一般是使用 sql 在数据库;本文件比较简单,直接用 orm 生成

  1. 创建目录 internal/model/mysqlmodel,代码如下:
package mysqlmodelimport ("time""gorm.io/gorm"
)type ReviewInfo struct {ID uint `gorm:"primaryKey,autoIncrement"`// 默认可以为空,非空,要显示设置;UserID uint `gorm:"comment:创建方表示;not null"`// varchar(512) 这里的 512是字符数,不是字节数,这里能存 512个汉字Content        string         `gorm:"type:varchar(512);comment:评论内容;not null"`Score          uint8          `gorm:"type:tinyint(4);comment:评分;not null"`ShopScore      uint8          `gorm:"type:tinyint(4);comment:商家评分;not null"`LogisticsScore uint8          `gorm:"type:tinyint(4);comment:物流评分;not null"`HavePicture    bool           `gorm:"not null;comment:是否有图片,默认没有,有的话,去ReviewImage表中查询"`Status         uint8          `gorm:"comment:审核状态,1:待审核,2:已审核,3:已拒绝;not null;default:0"`OptIdea        string         `gorm:"type:varchar(216);comment:审核建议,如果拒绝,写拒绝的原因;not null"`CreatedAt      time.Time      `gorm:"comment:创建时间,自动生成"`UpdatedAt      time.Time      `gorm:"comment:更新时间,自动生成"`DeletedAt      gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}// 用于执行 mino中的 url
type ReviewImage struct {ID uint `gorm:"primaryKey,autoIncrement"`// 评论和评论回复图片都要存储,所以这里要区分// 在查询过程中,如果差图片,肯定要指定实体类型,所有创建联合索引,更合理// gorm中,两个字段使用同一个索引名将创建复合索引// 优先级 priority 定义,在查询过程中,先根据实体类型查询,再根据实体ID查询EntityType uint8          `gorm:"index:idx_type_review_id,priority:1;type:tinyint(4);comment:实体类型,1:订单,2:评价"`EntityID   uint           `gorm:"index:idx_type_review_id,priority:2;comment:评论ID,用于关联ReviewInfo,创建索引"`URL        string         `gorm:"type:varchar(256);comment:图片URL"`CreatedAt  time.Time      `gorm:"comment:创建时间,自动生成"`UpdatedAt  time.Time      `gorm:"comment:更新时间,自动生成"`DeletedAt  gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}// 回复评论的列表
type ReviewReployInfo struct {ID        uint           `gorm:"primaryKey,autoIncrement"`ReviewID  uint           `gorm:"index:idx_review_id;comment:评论ID,用于关联ReviewInfo,创建索引"`CreatedAt time.Time      `gorm:"comment:创建时间,自动生成"`UpdatedAt time.Time      `gorm:"comment:更新时间,自动生成"`DeletedAt gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}

针对上表,为何如此设计,有几个问题,需要考虑

1. 为何目录为 internal/model/mysqlmodel ?

模型结构体,应该定义在 model 中,但是需要区分 es 和 mysql两种实体。如果直接叫 internal/model/mysql,根据go语言规范,package也要叫 mysql会和 data 层面的大量关键字冲突,自己写的代码,还能起个别名,但本文用的gen会自动生成文档,这个不好起别名,故包名 myqlmodel

2. 范式问题

因为 review 表中的图片,是存放在 ReviewImage 中的,而且 ReviewImage 表中的数据,会很多。那么是否可以在reviewInfo表中,冗余一个imageId组成的数组,直接在reviewImage表根据主键查询呢? 答案是不行,这明显不符合第一范式,会给后续的增删改查,都买下了大雷,至于考虑的提高性能的问题,大哥,考虑的有点多了。不要给自己找麻烦,才是正经。性能考虑是dba的事。

3. 组合索引问题

因为 评论和回复评论,都存在 reviewImage中了,所以查找之前,一定会声明类型(是 review 还是 reviewReply?)。所以这里要组合索引。再想想,他是否是唯一索引呢?(答案:不是)

4. gorm的使用技巧

具体看看注释吧,或者看看 gorm 的官方文档。https://gorm.io/zh_CN/docs/index.html
数据库声明的 varchar(256) 字段,256 是指的字符不是字节,如果使用UTF8MB4字符集,表示能存 256 个汉字,如果超出了,可能会截断,也可能会报错。可以根据需要设置

5. 模型定义好了,怎么链接数据库,自动迁移呢?

随便创建个文件空文件夹,起package名为main,用下面代码,跑一下就行(一个go.mod 项目,可以有多个 main 函数,但是main函数必须在main包中)

package mainimport ("review-service/internal/model/mysqlmodel""gorm.io/driver/mysql""gorm.io/gen""gorm.io/gorm"
)func main() {// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情dsn := "root:123456@tcp(127.0.0.1:3306)/review?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}// Migrate the schemaif err := db.AutoMigrate(&mysqlmodel.ReviewInfo{}, &mysqlmodel.ReviewImage{}); err != nil {panic(err)}g := gen.NewGenerator(gen.Config{OutPath: "../query",Mode:    gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode})g.UseDB(db) // reuse your gorm db// Generate basic type-safe DAO API for struct `model.User` following conventionsg.ApplyBasic(mysqlmodel.ReviewInfo{}, mysqlmodel.ReviewImage{}, mysqlmodel.ReviewReployInfo{})// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`// g.ApplyInterface(func(Querier) {}, model.User{}, model.Company{})// Generate the codeg.Execute()
}

如果感觉,自动生成的代码,有点多。可以把 *.gen.go放到 .gitignore 中,在 makefile 文件中,加上如下一行,每次拉取后,都自动生成

autoMigrate:cd ./internal/model && go run generate_mysql.go

注意,我这里,是为了看代码的时候,防止太乱,所有就把所有自动生成的代码,过滤掉了。每次都重新生成。实际项目中不建议这么搞,避免版本变动,导致新生成的代码和老代码,对不上。。。

相关新闻

  • [MS-DOS] DOS_6.22_Users_Manual_1994.pdf
  • AI元人文构想与余溪诗学空间:一场从诗意本源向智能未来的远征
  • 局域网共享一键通_v2.0.9.9

最新新闻

  • 指纹数据集终极指南:如何免费获取和使用50+权威指纹数据库
  • 指针(4)
  • 2026年|如何高效降低论文AI检测率?三招助你轻松通过Turnitin检测
  • Transformer 发明者加入 OpenAI、创业板创历史新高、微信给 AI 发“钱包“
  • Linux Pulseaudio深度解析之pa_mainloop_get_api调用流程与实战(六十七)
  • (2026新)湘潭正规防水补漏公司口碑榜TOP5权威推荐!卫生间/厨房/阳台/屋顶/天花板/地下室渗漏水检测维修攻略-靠谱漏水检测维修师傅推荐 - 安佳防水

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号