我正在Google App Engine上编写应用程序,并且我能够编写本地运行的代码并将数据放入本地数据存储区。但是,当我将代码部署到Google服务器时,没有数据放入数据存储区。我的主要指标是没有任何东西被放入数据存储区,一,当我进入开发者控制台时,我告诉没有条目,两个,当我运行获取数据的页面时,没有返回任何内容。
我是否需要在app.yaml或开发者控制台中定义新的种类才能在生产数据存储上运行?
这是我在数据存储中的put和get方法。再次,在测试环境中工作并且在生产中不起作用,一切都编译得很好。
package tweetdata
import (
"net/url"
"time"
"golang.org/x/net/context"
"google.golang.org/appengine/datastore"
"google.golang.org/appengine/log"
"github.com/ChimeraCoder/anaconda"
)
const linkTweetKind string = "LinkTweet"
const tweetKey string = "Tweets"
const tweetKeyID string = "default_tweetstore"
//LinkTweet contains the address extracted from a tweet and the original tweet
type LinkTweet struct {
Address *url.URL
Tweet anaconda.Tweet
}
//StoreTweet is a struct used for storing a tweet in the datastore
type StoreTweet struct {
Address string
Text string
TweetID int64
CreatedTime time.Time
Retweets int
Favorites int
}
//TweetScore is a struct that shows the relative score of an address based on
// it's populatrity
type TweetScore struct {
Address *url.URL
score int
lastActive time.Time
}
//WriteLinkTweet writes a given Tweet to the datastore
func WriteLinkTweet(tweet LinkTweet, c context.Context) error {
log.Infof(c, "Putting Tweet into datastore: %v", tweet.Tweet.Id)
key := datastore.NewIncompleteKey(c, linkTweetKind, getTweetKey(c))
created, _ := tweet.Tweet.CreatedAtTime()
store := &StoreTweet{Address: tweet.Address.String(),
Text: tweet.Tweet.Text,
TweetID: tweet.Tweet.Id,
CreatedTime: created,
Retweets: tweet.Tweet.RetweetCount,
Favorites: tweet.Tweet.FavoriteCount,
}
err := datastore.RunInTransaction(c, func(c context.Context) error {
_, err := datastore.Put(c, key, store)
log.Errorf(c, "Failed to write LinkTweet to datastore. %v", err.Error())
return err
}, nil)
return err
}
//GetAllNewTweets queries the datastore and gets all tweets created since the last
// time given
func GetAllNewTweets(since time.Time, c context.Context) []StoreTweet {
q := datastore.NewQuery(linkTweetKind).Ancestor(getTweetKey(c)).Filter("CreatedTime >=", since)
out := make([]StoreTweet, 0, 15)
q.GetAll(c, &out)
return out
}
// guestbookKey returns the key used for all guestbook entries.
func getTweetKey(c context.Context) *datastore.Key {
// The string "default_guestbook" here could be varied to have multiple guestbooks.
return datastore.NewKey(c, tweetKey, tweetKeyID, 0, nil)
}
答案 0 :(得分:2)
您会看到“最终一致性”(通常最初令人困惑)的效果。在事务之外编写的实体需要一段时间才能对查询可见。
https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/解释了这个问题。 https://cloud.google.com/appengine/docs/go/datastore/transactions具体到了。
答案 1 :(得分:0)
您是否在datastore:,noindex
结构中的任何字段上使用StoreTweet
?要对任何字段运行任何查询,数据存储区必须首先索引要查询的字段。因此,不索引这些字段将导致查询返回nil而没有任何错误。在第一次运行查询后,您的开发服务器是否会在项目中自动创建index.yaml文件?生产数据存储区使用此文件来决定应将哪些字段编入索引,所有未编入索引的字段将无法查询。根据您提供的信息,这是我能想到的,这会导致您的查询返回空白。
为了进一步调试,我会浏览您的生产数据存储区并确保您的数据结构正确,并将值设置为您期望的值。