gpt4 book ai didi

python - 从 Go 中的 Python 项目加载数据存储实体会导致嵌套结构 slice 错误

转载 作者:IT王子 更新时间:2023-10-29 00:37:05 24 4
gpt4 key购买 nike

出于性能原因,我正在使用 Go 在我的 Google AppEngine 项目中编写一个模块,但需要能够读取我在数据存储区中的一些实体。我编写了 Go 代码以便能够读取我在 Python 中构建的实体,但出现以下错误:

数据存储:展平嵌套结构导致 slice slice :字段“消息”

Python 中的模型定义:

class ModelB(ndb.Model):
msg_id = ndb.StringProperty(indexed=False)
cat_ids = ndb.StringProperty(repeated=True, indexed=False)
list_ids = ndb.StringProperty(repeated=True, indexed=False)
default_list_id_index = ndb.IntegerProperty(indexed=False)

class ModelA(ndb.Model):
date_join = ndb.DateTimeProperty(auto_now_add=True)
name = ndb.StringProperty()
owner_salutation = ndb.StringProperty(indexed=False)
owner_email_address = ndb.StringProperty()
logo_url = ndb.StringProperty(indexed=False)
...
messages = ndb.LocalStructuredProperty(ModelB, name='bm', repeated=True)

在 Go 中:

type ModelB struct {
MessageID string `datastore:"msg_id,noindex"`
CategoryIDs []string `datastore:"cat_ids,noindex"`
ListIDs []string `datastore:"list_ids,noindex"`
DefaultListIDIndex int `datastore:"default_list_id_index,noindex"`
}

type ModelA struct {
DateJoin time.Time `datastore:"date_join,"`
Name string `datastore:"name,"`
OwnerSalutation string `datastore:"owner_salutation,noindex"`
OwnerEmailAddress string `datastore:"owner_email_address,"`
LogoURL string `datastore:"logo_url,noindex"`
Messages []ModelB `datastore:"bm,"`
}

我这里有什么地方做错了吗?仅仅是 Go 与 Python 模型定义之间的功能不兼容吗?

尝试解码 ModelB

重新定义ModelA如下:

import pb "appengine_internal/datastore"
import proto "code.google.com/p/goprotobuf/proto"

type ModelA struct {
DateJoin time.Time `datastore:"date_join,"`
Name string `datastore:"name,"`
OwnerSalutation string `datastore:"owner_salutation,noindex"`
OwnerEmailAddress string `datastore:"owner_email_address,"`
LogoURL string `datastore:"logo_url,noindex"`
Messages []ModelB `datastore:"-"`
}

// Load is implemented for the PropertyLoaderSaver interface.

func (seller *ModelA) Load(c <-chan datastore.Property) error {
f := make(chan datastore.Property, 100)
for p := range c {
if p.Name == "bm" {
var val pb.EntityProto
err := proto.Unmarshal([]byte(p.Value.(string)), &val)
if err != nil {
return err
}
//TODO: Store result as a new ModelB
} else {
f <- p
}
}
close(f)
return datastore.LoadStruct(seller, f)
}

但是我收到以下错误:proto:未设置必填字段“{Unknown}”

最佳答案

Go 数据存储包不支持这样的两层 slice 。您可以拥有 []ModelB,只要 ModelB 不包含任何 slice 。或者,您可以在 ModelA 中使用 ModelB,并且 ModelB 可以在其中包含 slice 。但是你不能同时让 []ModelBModelB 都有 slice 。参见 the code对于错误情况。您的选择:

  1. 不要在 Go 中这样做
  2. 编写您自己的数据存储解串器来处理这种情况——这可能很难
  3. 更改您的 Python 数据结构以满足 Go 要求并重写您的数据

关于python - 从 Go 中的 Python 项目加载数据存储实体会导致嵌套结构 slice 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20710802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com