首页  >  文章  >  后端开发  >  在处理日期时间类型时,如何将 gorm.Model 字段集成到 Protobuf 定义中,不同方法的优缺点是什么?

在处理日期时间类型时,如何将 gorm.Model 字段集成到 Protobuf 定义中,不同方法的优缺点是什么?

Susan Sarandon
Susan Sarandon原创
2024-11-01 06:44:02868浏览

How do you integrate gorm.Model fields into Protobuf definitions while handling datetime types, and what are the pros and cons of different methods?

Gorm 模型字段的 Protobuf 集成

在构建数据库使用的数据时,必须将 gorm.Model 字段集成到 protobuf 定义中。尽管 protobuf 缺乏日期时间类型,但可以通过自定义生成的 protobuf 代码来设计解决方案。

使用 protoc-gen-gorm 失败的解决方案

尝试实现protoc-gen-gorm 项目被证明是徒劳的,因为在混合过程中 proto2 和 proto3 之间可能存在冲突。

用于后处理的自定义脚本

另一种方法是从 protobuf 生成 go 文件后创建用于后处理的自定义脚本。以下是解决方案的细分:

原始 Protobuf 文件

<code class="proto">message Profile {
  uint64 id = 1;
  string name = 2;
  bool active = 3;
}</code>

生成的 Protobuf Go 文件

<code class="go">type Profile struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Id     uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
    Name   string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
    Active bool   `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"`
}</code>

自定义 GORM 脚本

<code class="bash">g () {
  sed "s/json:\",omitempty\"/json:\",omitempty\" gorm:\"type:\"/"
}

cat  \
| g "id" "primary_key" \
| g "name" "varchar(100)" \
> .tmp && mv {.tmp,}</code>

后处理的 Protobuf Go 文件

<code class="go">type Profile struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Id     uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty" gorm:"type:primary_key"`
    Name   string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty" gorm:"type:varchar(100)"`
    Active bool   `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"`
}</code>

此脚本将 gorm 字段标签添加到生成的 protobuf Go 中文件,允许将 protobuf 定义与 gorm.Model 字段集成,以实现无缝数据库交互。

以上是在处理日期时间类型时,如何将 gorm.Model 字段集成到 Protobuf 定义中,不同方法的优缺点是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn