我正在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
检索实体时,它会很好地加载到结构中,我可以使用该对象在我的代码中。
我不知道为什么这不起作用。
答案 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
)。
这可能是一件很容易复制的事情,但我还没有找到它。如果其他人开始测试请添加评论,否则我最终会提交错误报告。