我在app引擎上有一个python模块和一个go模块。 go模块非常简单,只是为数据存储提供了一个只读搜索接口,由python模块填充。
如何将以下ndb模型转换为go结构:
class Course(ndb.Model):
name = ndb.StringProperty()
neat_name = ndb.StringProperty(required=True)
country = ndb.KeyProperty(kind=Country, required=True)
university = ndb.KeyProperty(kind=University, required=True)
faculty = ndb.KeyProperty(kind=Faculty, required=True)
department = ndb.KeyProperty(kind=Department, required=True)
stage = ndb.KeyProperty(kind=Stage, required=True)
legacy_id = ndb.StringProperty()
course_title = ndb.StringProperty(required=True, indexed=False)
course_description = ndb.TextProperty(required=True)
course_link = ndb.StringProperty(required=True, indexed=False)
#0-5 or None or not has attribute.
course_rating_ = ndb.FloatProperty()
course_review_count_ = ndb.IntegerProperty()
首先,我会:
type Course struct {
Name string `datastore:"name"`
NeatName `datastore:"neat_name"`
...
}
对于ndb.KeyProperty
属性 - 我是否只在我的string
中使用了struct
? &安培;我将不得不解析那个字符串 - 那是直接的吗?
我也可以忽略required=True
& indexed=False
选项?显然,因为我没有做任何写作?
答案 0 :(得分:2)
每https://cloud.google.com/appengine/docs/go/datastore/entities#Go_Properties_and_value_types,String
(最多500个字符的短字符串,默认编入索引)映射到Go string
; Text
(最长1MB的长字符串,未编入索引)也可以转到string
,但始终使用noindex
;对于数据存储Key
,有*datastore.Key
,请参阅https://cloud.google.com/appengine/docs/go/datastore/reference#Key; Integer
,int64
;对于Float
,float64
(您可以使用较短的整数和浮点数,但数据存储区每个都使用64位,因此您可以: - )。
我也可以忽略
required=True
&indexed=False
选项?
是required
,但我相信,使用https://cloud.google.com/appengine/docs/go/datastore/reference,您必须对noindex
使用选项Text
,因为有必要指出可以更长的字符串比512(unicode)字符。
不确定哪个版本的go
及其datastore
软件包会强制执行此约束,但即使现有版本没有它也更安全地尊重它 - 否则您的应用可能会破坏简单的Go版本升级! - )
答案 1 :(得分:0)
这是代码 - 它在生产和工作中工作当地也是:
type Course struct {
Name string `datastore:"name"`
NeatName string `datastore:"neat_name"`
Country *datastore.Key `datastore:"country"`
University *datastore.Key `datastore:"university"`
Faculty *datastore.Key `datastore:"faculty"`
Department *datastore.Key `datastore:"department"`
Stage *datastore.Key `datastore:"stage"`
LegacyId string `datastore:"legacy_id"`
CourseTitle string `datastore:"course_title,noindex"`
CourseDescription string `datastore:"course_description"`
CourseLink string `datastore:"course_link,noindex"`
CourseRating float64 `datastore:"course_rating_"`
CourseReviewCount int64 `datastore:"course_review_count_"`
}
和
func (ttt *EdSearchApi) Search(r *http.Request,
req *SearchQuery, resp *SearchResults) error {
c := appengine.NewContext(r)
q := datastore.NewQuery("Course").Limit(1)
var courses []Course
_, err := q.GetAll(c, &courses)
c.Infof("err %v", err)
c.Infof("courses 0: %v", courses[0])
c.Infof("!!!")
return nil
}