Генерация golang структур по содержимому mongodb
30 марта, 2016
Наткнулся на замечательную библиотечку https://github.com/facebookgo/mongoschema
Генерирует по содержимому коллекции golang структуры, сразу с bson тегами, чтобы использовать с mgo
Лёгкий пример, с плоскими данными:
◼ ▶ $GOPATH/bin/mongoschema -url=localhost -db=test -collection=users -struct=User -package=main package main type User struct { Google string `bson:"google,omitempty"` ID bson.ObjectId `bson:"_id,omitempty"` Email string `bson:"email,omitempty"` DisplayName string `bson:"displayName,omitempty"` Picture string `bson:"picture,omitempty"` }
Для данных с разной структурой будет выдана невалидная структура, в которой нужно самостоятельно выбрать проблемные участки. Работает только с флагом -raw
◼ ▶ $GOPATH/bin/mongoschema -url=localhost -db=test -collection=coupons -struct=Coupon -package=main -raw package main import ( "gopkg.in/mgo.v2/bson" "time" ) type Coupon struct { SphinxID int64 `bson:"sphinx_id,omitempty"` ID bson.ObjectId `bson:"_id,omitempty"` PageID bson.ObjectId `bson:"page_id,omitempty"` SiteID bson.ObjectId `bson:"site_id,omitempty"` Publicated bool `bson:"publicated,omitempty"` DateCreation time.Time `bson:"date_creation,omitempty"` PublicatedTime time.Time `bson:"publicated_time,omitempty"` DateModification time.Time `bson:"date_modification,omitempty"` Item struct { Bonus string `bson:"bonus,omitempty"` Dates interface{} /* []interface{} /* */, struct { Beginsell time.Time `bson:"beginsell,omitempty"` Endsell time.Time `bson:"endsell,omitempty"` Endvalid time.Time `bson:"endvalid,omitempty"` Beginvalid time.Time `bson:"beginvalid,omitempty"` }, struct { Endsell time.Time `bson:"endsell,omitempty"` }, struct { Beginsell time.Time `bson:"beginsell,omitempty"` Endsell time.Time `bson:"endsell,omitempty"` Endvalid time.Time `bson:"endvalid,omitempty"` }, struct { Beginsell time.Time `bson:"beginsell,omitempty"` Endsell time.Time `bson:"endsell,omitempty"` }, struct { Endsell time.Time `bson:"endsell,omitempty"` Endvalid time.Time `bson:"endvalid,omitempty"` }, struct { Beginsell time.Time `bson:"beginsell,omitempty"` Endsell time.Time `bson:"endsell,omitempty"` Beginvalid time.Time `bson:"beginvalid,omitempty"` }, struct { Endsell time.Time `bson:"endsell,omitempty"` Endvalid time.Time `bson:"endvalid,omitempty"` Beginvalid time.Time `bson:"beginvalid,omitempty"` }, struct { Endvalid time.Time `bson:"endvalid,omitempty"` Beginvalid time.Time `bson:"beginvalid,omitempty"` }, struct { Beginsell time.Time `bson:"beginsell,omitempty"` Beginvalid time.Time `bson:"beginvalid,omitempty"` } */ `bson:"dates,omitempty"` Tags interface{} /* []string, [][]string */ `bson:"tags,omitempty"` Description interface{} /* []string, []interface{} /* */, string, [][]string, []struct { P string `bson:"p,omitempty"` } */ `bson:"description,omitempty"` Price struct { Currency string `bson:"currency,omitempty"` Coupon interface{} /* string, int64 */ `bson:"coupon,omitempty"` Economy string `bson:"economy,omitempty"` Sold int64 `bson:"sold,omitempty"` DiscountPrice int64 `bson:"discount_price,omitempty"` Discont interface{} /* string, int64 */ `bson:"discont,omitempty"` Full interface{} /* string, int64 */ `bson:"full,omitempty"` } `bson:"price,omitempty"` Location string `bson:"location,omitempty"` URL string `bson:"url,omitempty"` ID string `bson:"id,omitempty"` Supplier struct { URL string `bson:"url,omitempty"` Addresses []struct { Coordinates string `bson:"coordinates,omitempty"` Name string `bson:"name,omitempty"` } `bson:"addresses,omitempty"` Tel string `bson:"tel,omitempty"` Name string `bson:"name,omitempty"` } `bson:"supplier,omitempty"` IsClosed bool `bson:"is_closed,omitempty"` Title string `bson:"title,omitempty"` Type string `bson:"type,omitempty"` Images interface{} /* []interface{} /* struct { URL string `bson:"url,omitempty"` CdnFilename string `bson:"cdn_filename,omitempty"` } */, []interface{} /* */, []struct { URL string `bson:"url,omitempty"` CdnFilename string `bson:"cdn_filename,omitempty"` }, []struct { URL string `bson:"url,omitempty"` CdnFilename bool `bson:"cdn_filename,omitempty"` }, []struct { URL string `bson:"url,omitempty"` CdnFilename interface{} /* string, bool */ `bson:"cdn_filename,omitempty"` }, []struct { URL string `bson:"url,omitempty"` CdnFilename interface{} /* bool, string */ `bson:"cdn_filename,omitempty"` }, []struct { URL string `bson:"url,omitempty"` } */ `bson:"images,omitempty"` CouponType string `bson:"coupon_type,omitempty"` } `bson:"item,omitempty"` }