Интеграция полей gorm.Model в определения protobuf

Я пытаюсь понять, как интегрировать поля gorm.Model (deleted_at, create_at, id и т. Д.) В мои определения proto3. Однако я не могу использовать тип datetime для proto3. Я попытался найти документацию о том, как сериализовать поля gorm в строки (поскольку proto3 обрабатывает строки), но я ничего не нашел.

Кто-нибудь смог успешно использовать поля модели горма в своих прото-определениях? Я использую плагин go-micro для создания файлов * pb.go.

Вот мое текущее определение сообщения, которое не работает. Похоже, что в базе данных для deleted_at хранятся пустые строки, поскольку при запросе на deleted_at значение null база данных 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;
}

ОБНОВЛЕНИЕ: я обновил свой прототип до следующего, но 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;
}

person Alex Luis Arias    schedule 27.12.2017    source источник


Ответы (3)


Проект protoc-gen-gorm у меня не работал. Похоже, что происходит некоторое смешение proto2 и proto3, и в конечном итоге я не смог заставить его работать.

Мое решение состояло в том, чтобы создать скрипт для постобработки после того, как я сгенерирую файлы go из protobuf.

Если бы это был мой прототип profile/profile.proto:

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

Что создало profile/profile.pb.go стандартной командой protoc:

// ...
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,}

Который я вызываю в моем файле go после того, как он сгенерирован с помощью ./gorm.sh profile/profile.pb.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"`
}
// ...
person nobane    schedule 27.08.2020

Попробуйте использовать protoc-gen-gorm. Будет создан еще один файл .pb.gorm.go

person Rustam Turgunov    schedule 08.10.2019

Возможно, можно использовать что-то вроде этого: https://github.com/favadi/protoc-go-inject-tag для автоматической генерации тегов (я все еще изучаю это сам)

person Aibek    schedule 31.05.2021