云数据存储客户端.GetAll类型不匹配,但client.Get工作

时间:2018-04-18 23:57:57

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

我正在go编写一个app engine应用程序,它连接并返回datastore个实体的一些信息。我遇到的问题是client.Get正在使用预定义的结构,但client.GetAll会导致类型不匹配(反之亦然)。

我正在使用以下结构:

type myStruct struct {
    ID              int64
    Field1          string
    Field2          string
    Release_Date    time.Time
}

Release_Date定义为time.Time时失败(int失败)

k := db.datastoreKey(id)
myStruct := &myStruct{}
if err := db.client.Get(ctx, k, myStruct ); err != nil {
        return nil, fmt.Errorf("datastore: %v", err)
}

func (db *datastoreDB) datastoreKey(id int64) *datastore.Key {
    return datastore.IDKey("myEntityType", id, nil)
}

Release_Date定义为time.Time时失败(如果int有效):

var myStructs []*myStruct 
q := datastore.NewQuery("myEntityType").
            Project("field1", "field2", "release_date").
            Order("field1")
keys, err := db.client.GetAll(ctx, q, &myStructs)
if err != nil {
        return nil, fmt.Errorf("datastore: %v", err)
}

错误:

  

datastore:无法加载字段" release_date"进入" myStruct":类型不匹配:int与time.Time

(反之亦然,当我交换Release_Date定义时)。

任何想法有什么不对或这是一个错误?

其他信息:

我查看了实体仪表板,并在那里将数据类型列为Data/Time,当我使用Get检索实体时,它会很好地加载到结构中,我可以使用该对象在我的代码中。

我不知道为什么这不起作用。

1 个答案:

答案 0 :(得分:1)

所以这不是一个优雅的解决方案,但它对我有用。

认为的原因是我创建的第一个实体有一个Release_Date类型的字段int,但后来我使用{{1}类型添加了实体1}}。在我的测试过程中,我最终删除了Date/Time类型为int的实体,因此剩余的实体只有Release_Date。尽管Date/Time没有类型int的实体,但我的代码在服务器端失败了。它一直期望该字段为Release_Date类型。

我的理论是实体定义是在我第一次创建实体时建立的,并且在我稍后更改数据类型时未更新,即使没有实体仍使用类型int

所以我最终做的是备份我的实体,删除所有实体,然后在int字段中重新添加仅Date/Time的实体。一旦我这样做,一切都很好。我的外壳仍然与上面显示的相同(即我的Release_Date使用Struct,但我的查询使用Field)。

这可能是一件很容易复制的事情,但我还没有找到它。如果其他人开始测试请添加评论,否则我最终会提交错误报告。