猿问

Golang 中 DynamoDB 索引键的空字符串

在与 DynamoDB 通信时,我一直在使用 Protobuf 进行对象定义。到目前为止,这些对象看起来像这样:


type Record struct {

    state         protoimpl.MessageState

    sizeCache     protoimpl.SizeCache

    unknownFields protoimpl.UnknownFields


    Id               string        `protobuf:"bytes,2,opt,name=id,json=id,proto3" dynamodbav:"id,omitempty" json:"id,omitempty"`

    Name             string        `protobuf:"bytes,3,opt,name=name,json=name,proto3" dynamodbav:"name,omitempty" json:"name,omitempty"`

    OrgId            string        `protobuf:"bytes,4,opt,name=org_id,json=orgId,proto3" dynamodbav:"org_id,omitempty" json:"org_id,omitempty"`

    AccountId        string        `protobuf:"bytes,7,opt,name=account_id,json=accountId,proto3" dynamodbav:"account_id,omitempty" json:"account_id,omitempty"`

    Address          string        `protobuf:"bytes,9,opt,name=address,proto3" dynamodbav:"address,omitempty" json:"address,omitempty"`

    BillingTitle     string        `protobuf:"bytes,10,opt,name=billing_title,json=billingTitle,proto3" dynamodbav:"billing_title,omitempty" json:"billing_title,omitempty"`

}


这段代码不会惊慌,我会看到 DynamoDB 中的值。但是,omitempty从所有标签中删除该子句后dynamodbav,我注意到现在失败并出现以下错误:


ValidationException: Invalid attribute value type

        status code: 400, request id: 6a626232-fcd4-4999-afe4-3df5769ce1b2

我想使用默认值而不是前者,NULL: true但我没有看到任何序列化选项。有没有办法在不实现 DynamoDB 封送器接口的情况下做到这一点?


慕码人2483693
浏览 81回答 1
1回答

郎朗坤

经过一番调查,我在这里Marshal找到了该函数的源代码。据此,我可以设置一个名为的字段来告诉编码器我希望将空字符串作为字符串发送,而不是作为空属性发送。但是,如果我设置它,我不能直接使用, 。所以,我复制了它们并写了我自己的:NullEmptyStringMarshalMarshalMapMarshalListfunc MarshalMap(in interface{}) (map[string]*dynamodb.AttributeValue, error) {    av, err := getEncoder().Encode(in)    if err != nil || av == nil || av.M == nil {        return map[string]*dynamodb.AttributeValue{}, err    }    return av.M, nil}func getEncoder() *dynamodbattribute.Encoder {    encoder := dynamodbattribute.NewEncoder()    encoder.NullEmptyString = false    return encoder}
随时随地看视频慕课网APP

相关分类

Go
我要回答