在Google App Engine数据存储区中建立多种关系

时间:2014-07-08 01:16:25

标签: google-app-engine go google-cloud-datastore

我是Go的新手,到目前为止,我很喜欢它。但是,我无法解决这个问题。

我有一个简单的包裹,发票。

type Invoice struct {
    key datastore.Key
    Name string
    Created time.Time
    Updated time.Time
    lineItems []LineItem
}

发票有几个LineItem。

type LineItem struct {
    key datastore.Key
    InvoiceKey *datastore.Key
    Name string
    Description string
}

我的包有几个功能。

func New(c appengine.Context) (i Invoice)
func (i *Invoice) Update()
func (i *Invoice) Save(c appengine.Context)
func (i *Invoice) AddLineItem(c appengine.Context, name string)

New()返回一个新的Invoice,并将Invoice内的datastore.NewIncompleteKey()生成的密钥保存为未导出的变量,以便我以后保存。

所有这些都运行良好,无论是否正确的方式这样做是另一个问题。我也对此发表评论。我似乎无法弄清楚的是最后一个功能。

func (i *Invoice) AddLineItem(c appengine.Context, name string) {
    key := datastore.NewIncompleteKey(c, "LineItem", &i.key)
    lineItem := LineItem{key: *key, InvoiceKey: &i.key, Name: name}
    i.lineItems = append(i.lineItems, lineItem)
}

在Save()

for _, lineItem := range i.lineItems {
    _, err := datastore.Put(c, &lineItem.key, &lineItem)
    if err != nil {
        panic(err)
    }
}

我这里一直收到无效的密钥错误。我基本上只是想让发票有能力拥有许多LineItems。能够将它们全部保存到数据存储区,然后根据需要将所有LineItem拉出整个Invoice。

我是否在正确的轨道上?有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

您的lineItems []LineItemkey datastore.Key未被导出,他们需要以大写字母开头,否则GAE将无法使用它。

来自specs

  

可以导出标识符以允许从另一个包访问它。如果两者都导出标识符:

     
      
  1. 标识符名称的第一个字符是Unicode大写字母(Unicode类" Lu");和
  2.   
  3. 标识符在包块中声明,或者是字段名称或方法名称。
  4.         

    不会导出所有其他标识符。

答案 1 :(得分:0)

请勿使用datastore.Key,而是使用*datastore.Key。任何时候你认为它可能没有被设置是一个bug的来源,并且可能会把你的无效密钥错误变成恐慌。

您正在为LineItem个密钥提供父级(Invoice),这很好,但为什么除了Invoice密钥之外还存储LineItem密钥?你可以通过调用后者的Parent方法来获得前者。

答案 2 :(得分:0)

我遇到的问题是尝试使用不完整的发票密钥来生成不完整的LineItem密钥。

key, err := datastore.Put(c, &i.key, i)

使用put中返回的完整密钥。

for _, lineItem := range i.lineItems {
    key := datastore.NewIncompleteKey(c, "LineItem", key)
    lineItem.InvoiceKey = k
    _, err := datastore.Put(c, key, &lineItem)
    if err != nil {
        panic(err)
    }
}

存储它们。现在的任务是弄清楚如何从数据存储中读取它们!祝我好运。