ほげほげほげほ

ただのメモ置き場です。基本的にプログラム関連のメモ。

beego使ってみた

なんでbeego?

  • なんとなくGo言語使ってみようとなり、どのFWが良いか選定するため
  • echo, beego, ginはやってみた。

特徴

  • Webアプリ用のフルスタックフレームワーク
  • Rubyっぽい
  • beego用のORMがある
  • beego用のCLIツール(bee)がある
  • プロジェクト作るとcontrollerディレクトリ等がすでにあり、作り方がある程度決まっている
  • Rubyっぽい
  • scaffoldを使ってのコード自動生成ができる
  • MVCモデル
  • Viewを必要としないAPIモードあり
  • i18n対応
  • LiveReloadあり
  • ハチがかわいい f:id:kusobutayarow:20190323204407p:plain

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にある適当な名前

所感

  • フレームワークディレクトリ構成が決まっているのはこれくらいじゃないでしょうか. あらかじめ決めてないとカオスになるので、これが決まっているのは嬉しいかも.
  • LiveReloadが嬉しい。コンパイルもはやい
  • RubyからGoに乗り換えるのであればこのFWなのかなと思いました。