2015-03-03 4 views
0

У меня есть модуль python и модуль go на движке приложения. Модуль go довольно прост и просто предоставляет интерфейс поиска только для чтения в хранилище данных, которое заполняется модулем python.appengine: convert ndb model to go lang struct

Как преобразовать следующую Ndb модели в ходе структуру:

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

По https://cloud.google.com/appengine/docs/go/datastore/entities#Go_Properties_and_value_types, String (короткая строка до 500 символов, по умолчанию указана) сопоставляется с Go string; Text (длинная строка до 1 МБ, не проиндексированная) также для перехода string, но всегда с noindex; для хранилища данных Key есть *datastore.Key, см. https://cloud.google.com/appengine/docs/go/datastore/reference#Key; для Integer, int64; для Float, float64 (вы можете использовать более короткие int и float, но хранилище данных использует по 64 бита для каждого в любом случае, так что вы могли бы также :-).

Также можно просто игнорировать required=True & indexed=False варианты?

Да для required, но я считаю, что, используя https://cloud.google.com/appengine/docs/go/datastore/reference, вы должны использовать опцию noindex для Text, потому что это необходимо указать строки, которые могут быть больше, чем 512 (Unicode) символов.

Не знаете, какие версии go и его пакет datastore обеспечивают это ограничение, но даже если нынешний он не безопаснее его уважать, - иначе ваше приложение может порвать с простым обновлением версии Go! -)

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 
}