在 Go 中从 Python 项目加载数据存储实体导致嵌套结构切片错误

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


datastore: flattening nested structs leads to a slice of slices: field "Messages"


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 模型定义之间的功能不兼容吗?


慕村225694
浏览 236回答 3
3回答

一只甜甜圈

Go 数据存储包不支持这样的两层切片。[]ModelB只要ModelB不包含任何切片,您就可以拥有。或者,您可以使用ModelBin ModelA,并且ModelB可以在其中包含切片。但是你不能两者兼得,[]ModelB而且ModelB有切片。请参阅错误条件的代码。您的选择:不要在 Go 中这样做编写自己的数据存储解串器来处理这种情况 - 这可能很难更改您的 Python 数据结构以满足 Go 要求并重写您的数据
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go