appengine:将ndb模型转换为lang struct

时间:2015-03-03 21:24:15

标签: python google-app-engine go

我在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选项?显然,因为我没有做任何写作?

2 个答案:

答案 0 :(得分:2)

https://cloud.google.com/appengine/docs/go/datastore/entities#Go_Properties_and_value_typesString(最多500个字符的短字符串,默认编入索引)映射到Go string; Text(最长1MB的长字符串,未编入索引)也可以转到string,但始终使用noindex;对于数据存储Key,有*datastore.Key,请参阅https://cloud.google.com/appengine/docs/go/datastore/reference#Key; Integerint64;对于Floatfloat64(您可以使用较短的整数和浮点数,但数据存储区每个都使用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
}