将 gorm.Model 字段集成到 protobuf 定义中
Integrating gorm.Model fields into protobuf definitions
我想弄清楚如何将 gorm.Model 字段(deleted_at、create_at、id 等)集成到我的 proto3 定义中。但是,我不能为 proto3 设置日期时间类型。我试图寻找有关如何将 gorm 字段序列化为字符串的文档(因为 proto3 处理字符串)但我没有找到任何东西。
有没有人能够在他们的原型定义中成功使用 gorm 模型字段?我正在使用 go-micro 的插件生成 *pb.go 文件。
这是我当前的消息定义,它不起作用。似乎空字符串被存储在 deleted_at 的数据库中,因为当查询 deleted_at 为 null 时,postgres 数据库 returns 什么都没有。
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;
}
更新:
我已将 proto 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。它将创建另一个文件 .pb.gorm.go
protoc-gen-gorm
项目对我不起作用。看起来 proto2 和 proto3 发生了一些混合,最终我无法让它工作。
我的解决方案是在从 protobuf 生成 go 文件后创建一个脚本来进行 post 处理。
如果这是我的原型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:\",omitempty\"/json:\",omitempty\" gorm:\"type:\"/"
}
cat \
| g "id" "primary_key" \
| g "name" "varchar(100)" \
> .tmp && mv {.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"`
}
// ...
可能是使用这样的选项:https://github.com/favadi/protoc-go-inject-tag 自动生成标签(我自己仍在研究)
我想弄清楚如何将 gorm.Model 字段(deleted_at、create_at、id 等)集成到我的 proto3 定义中。但是,我不能为 proto3 设置日期时间类型。我试图寻找有关如何将 gorm 字段序列化为字符串的文档(因为 proto3 处理字符串)但我没有找到任何东西。
有没有人能够在他们的原型定义中成功使用 gorm 模型字段?我正在使用 go-micro 的插件生成 *pb.go 文件。
这是我当前的消息定义,它不起作用。似乎空字符串被存储在 deleted_at 的数据库中,因为当查询 deleted_at 为 null 时,postgres 数据库 returns 什么都没有。
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;
}
更新: 我已将 proto 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。它将创建另一个文件 .pb.gorm.go
protoc-gen-gorm
项目对我不起作用。看起来 proto2 和 proto3 发生了一些混合,最终我无法让它工作。
我的解决方案是在从 protobuf 生成 go 文件后创建一个脚本来进行 post 处理。
如果这是我的原型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:\",omitempty\"/json:\",omitempty\" gorm:\"type:\"/"
}
cat \
| g "id" "primary_key" \
| g "name" "varchar(100)" \
> .tmp && mv {.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"`
}
// ...
可能是使用这样的选项:https://github.com/favadi/protoc-go-inject-tag 自动生成标签(我自己仍在研究)