登录
首页 >  Golang >  Go问答

向 protobuf 定义中添加 gorm.Model 字段

来源:stackoverflow

时间:2024-02-18 08:42:24 458浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《向 protobuf 定义中添加 gorm.Model 字段》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我正在尝试弄清楚如何将 gorm.model 字段(deleted_at、create_at、id 等)集成到我的 proto3 定义中。但是,我无法为 proto3 提供日期时间类型。我尝试寻找有关如何将 gorm 字段序列化为字符串的文档(因为 proto3 处理字符串),但我没有找到任何内容。

有人能够在其原型定义中成功使用 gorm 模型字段吗?我正在使用 go-micro 的插件来生成 *pb.go 文件。

这是我当前的消息定义,但不起作用。看起来空字符串被存储在数据库中的deleted_at 中,因为当查询deleted_at 为空时,postgres 数据库不会返回任何内容。

message databaseconfig {
    string address = 1;
    int32 port = 2;
    string databasename = 3;
    string username = 4;
    string password = 5;
    string databasetype = 6;
    string quertstatement = 7;
    int32 id = 8;
    string createdat = 9;
    string updatedat = 10;
    string deletedat = 11;
}

更新: 我已将我的原型 def 更新为以下内容,但 gorm 仍然无法正确使用 id、createdat、updatedat 和 deletedat 字段

syntax = "proto3";

package go.micro.srv.importer;

import "google/protobuf/timestamp.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

service ImporterService {
    rpc CreateDatabaseConfig(DatabaseConfig) returns (Response) {}
    rpc RetrieveDatabaseConfig(GetRequest) returns (Response) {}
    rpc UpdateDatabaseConfig(DatabaseConfig) returns (Response) {}
    rpc DeleteDatabaseConfig(DatabaseConfig) returns (Response) {}
}


message GetRequest {}


message DatabaseConfig {
    string address = 1;
    int32 port = 2;
    string databaseName = 3;
    string username = 4;
    string password = 5;
    string databaseType = 6;
    string quertStatement = 7;
    int32 id = 8;
    google.protobuf.Timestamp createdAt = 9 [(gogoproto.stdtime) = true];
    google.protobuf.Timestamp updatedAt = 10 [(gogoproto.stdtime) = true];
    google.protobuf.Timestamp deletedAt = 11 [(gogoproto.stdtime) = true];
}


message Response {
    bool created = 1;
    DatabaseConfig database_config = 2;

    repeated DatabaseConfig databaseConfigs = 3;
}

正确答案


protoc-gen-gorm 项目不适合我。看起来 proto2 和 proto3 发生了一些混合,最终我无法让它工作。

我的解决方案是在从 protobuf 生成 go 文件后创建一个脚本来进行后处理。

如果这是我的原型 profile/profile.proto

message profile {
  uint64 id = 1;
  string name = 2;
  bool active = 3;
  // ...
}

使用标准 protoc 命令创建了 profile/profile.pb.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"`
}
// ...

我使用这个脚本gorm.sh

#!/bin/bash

g () {
  sed "s/json:\"$1,omitempty\"/json:\"$1,omitempty\" gorm:\"type:$2\"/"
}

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

我在使用 ./gorm.sh profile/profile.pb.go 生成 go 文件后调用它, profile/profile.pb.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"`
}
// ...

尝试使用protoc-gen-gorm。它将创建另一个文件.pb.gorm.go

到这里,我们也就讲完了《向 protobuf 定义中添加 gorm.Model 字段》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>