Key*_*ang 6 google-app-engine go
我是Google App Engine的新手,遇到了数据存储的一些问题.
我写了一个测试GaeDatastore_test.go来测试datastore.Query.GetAll方法,见下文
package persist
import (
"fmt"
"testing"
"appengine/aetest"
"appengine/datastore"
)
type Mock struct {
Name string
}
func TestAll(t *testing.T) {
ctx, _ := aetest.NewContext(nil)
defer ctx.Close()
d := &Mock{
"hello",
}
fmt.Println(datastore.Put(ctx, datastore.NewIncompleteKey(ctx, "test", nil), d))
fmt.Println(datastore.Put(ctx, datastore.NewIncompleteKey(ctx, "test", nil), d))
fmt.Println(datastore.Put(ctx, datastore.NewIncompleteKey(ctx, "test", nil), d))
q := datastore.NewQuery("test")
var ms []Mock
q.GetAll(ctx, &ms)
fmt.Printf("%#v", ms)
}
Run Code Online (Sandbox Code Playgroud)
当我使用运行测试文件时
goapp测试
它不会返回我存储的3个实体.我可以在调用datastore.Put后看到键返回,我可以使用datastore.Get使用键检索它们.但'ms'总是为零.
然后我尝试使用初始化ms
使([]素,10)
但它没有太大的区别,数据仍未通过.
我检查了query.go源文件.在内部,它使用loadEntity,这与Get/GetMulti使用的方法相同,并使用append将元素推送到切片.ms是零,这很奇怪.
客户端连接到模拟GAE环境的Python服务器.有人可以帮忙吗?
小智 8
我相信这是因为您正在进行跨组查询,并且尚未将写入应用于数据存储.开发服务器模拟类似生产的写可见性.如果您不在事务或实体组中,查询将不会立即显示结果.
从文档中,
写操作在Commit阶段之后立即返回,然后Apply阶段异步发生.
和,
...当出现以下情况之一时,应用将前滚完成:
定期数据存储区扫描检查未完成的Commit作业并应用它们.使用受影响的实体组的某些操作(获取,放置,删除和祖先查询)会导致在继续执行新操作之前已完成但尚未应用的任何更改.
和,
由于数据存储区获取和祖先查询在执行之前应用任何未完成的修改,因此这些操作始终会看到所有先前成功事务的一致视图.这意味着get操作(通过其密钥查找更新的实体)可以保证看到该实体的最新版本.
有关这些引号的来源以及有关写入和数据可见性规则的更多详细信息,请参阅:https://developers.google.com/appengine/docs/go/datastore/#Go_Datastore_writes_and_data_visibility
以下是代码的修改版本,在每次放置后对返回的密钥执行Get.Get()强制要应用该键.这可确保您的GetAll查询将返回所有测试实体.
package persist
import (
"fmt"
"testing"
"appengine/aetest"
"appengine/datastore"
)
type Mock struct {
Name string
}
func TestAll(t *testing.T) {
ctx, _ := aetest.NewContext(nil)
defer ctx.Close()
d := &Mock{
"hello",
}
for i := 0; i < 3; i++ {
k, err := datastore.Put(ctx, datastore.NewIncompleteKey(ctx, "test", nil), d)
fmt.Println(k, err)
datastore.Get(ctx, k, nil)
}
q := datastore.NewQuery("test")
var ms []Mock
q.GetAll(ctx, &ms)
fmt.Printf("%#v", ms)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1519 次 |
最近记录: |