beego使ってみた
なんでbeego?
- なんとなくGo言語使ってみようとなり、どのFWが良いか選定するため
- echo, beego, ginはやってみた。
特徴
- Webアプリ用のフルスタックフレームワーク
- Rubyっぽい
- beego用のORMがある
- beego用のCLIツール(bee)がある
- プロジェクト作るとcontrollerディレクトリ等がすでにあり、作り方がある程度決まっている
- Rubyっぽい
- scaffoldを使ってのコード自動生成ができる
- MVCモデル
- Viewを必要としないAPIモードあり
- i18n対応
- LiveReloadあり
- ハチがかわいい
CLIツール
beego専用のCLIツールがある.
bee new {PROJECT_NAME} bee api {PROJECT_NAME}
LiveReload
bee
で起動していればファイル編集時に検知して再コンパイルしてくれる。嬉しい.
Swaggerが自動生成される
実装したあとのAPIのテストが楽かと思った. が、本来の開発だと先にSwaggerを作らないといけないと思う.
起動
bee run -downdoc=true -gendoc=true
DB接続など
beego用のormがある.
実装
apiモード
bee api {PROJECT_NAME}
でプロジェクトを作成するとapiモードになる。- apiモードで作るとviewが無い状態でテンプレが作られる
- デフォルトで作ったやつはRooterの設定がアレなのでアクセスしても404になった.
- 修正が必要
apiモードのRooter実装
http://localhost:8080/user/:name
func init() { ns := beego.NewNamespace("/api", beego.NSNamespace("/object", beego.NSInclude( &controllers.ObjectController{}, ), ), beego.NSNamespace("/user", beego.NSRouter("/:name", &controllers.UserController{}), <- ここ ), ) beego.AddNamespace(ns) }
bee/orm
models
structをmodelに書いてたら起動時にテーブル作ってくれた.Rubyっぽい
create table `user` -- -------------------------------------------------- -- Table Structure for `_/hogehogehogeho/models.User` -- -------------------------------------------------- CREATE TABLE IF NOT EXISTS `user` ( `id` varchar(255) NOT NULL PRIMARY KEY, `name` varchar(255) NOT NULL DEFAULT '' , `email` varchar(255) NOT NULL DEFAULT '' ) ENGINE=InnoDB;
model内実装,
func init() { orm.RegisterModel(new(User)) } type User struct { Id string `orm:"pk" json:"id"` Name string `json:"name"` Email string `json:"email"` } func GetUserByName(name string) (u *User, err error) { o := orm.NewOrm() _ = o.Read(&name, "Name") if u, ok := UserList[name]; ok { return u, nil } return nil, errors.New("User not exists") }
main
import ( ... "github.com/astaxie/beego/orm" ) func init() { ... dataSource := "root:@tcp(127.0.0.1:3306)/hogehogehogeho?charset=utf8" orm.RegisterDataBase("default", "mysql", dataSource, 30) orm.SetMaxIdleConns("default", 100) orm.SetMaxOpenConns("default", 100) ... }
実行
これで取れると.
curl http://localhost:8080/user/DBにある適当な名前