beego學習筆記
標籤:beego 學習筆記
參考資料:
推薦使用postman進行調試,這是一款很好地API開發工具,能夠比較方便地測試API(以各種參數加在body中,省去了自己寫程序的步驟)。
- beego搭建api服務,這是go語言中文網的,例子很不錯,但是不夠清楚。
- beego+swagger快速上手,非常好的教程,很實用,在10分鐘之內絕對可以完成一個簡單的demo。作者前面還寫過一篇swagger上手,可以看一下。關鍵點在於beego的API自動化文檔
快速入門
架構概述
beego是MVC結構,其中model主要負責數據庫(逐層抽象),view層爲模版,controller層作路由。
極速上手demo
要求:提前安裝好了go(或者docker跑golang鏡像)
安裝工具:go get github.com/astaxie/beego
和go get github.com/beego/bee
創建api項目:bee api apiTest
自動下載swagger文件,自動化文檔,即可在本地瀏覽默認API:http://localhost:8080/swagger/
。bee run -gendoc=true -downdoc=true
API目錄
├── conf
│ └── app.conf
├── controllers
│ └── object.go
│ └── user.go
├── docs
│ └── doc.go
├── main.go
├── models
│ └── object.go
│ └── user.go
├── routers
│ └── router.go
└── tests
└── default_test.go
剩下的就是閱讀controllers、models文件下的go文件源代碼
最終效果
讓beego運行Https的配置
appname = apiproject
httpport = 8080
runmode = dev
autorender = false
copyrequestbody = true
EnableDocs = true
EnableHTTPS = true
HTTPSCertFile = "cert.crt"
HTTPSKeyFile = "key.key"
sqlconn =
根目錄爲main.go所在目錄,把CA證書換成自己的即可使用。具體的配置信息參考這裏
核心部分
controller設計
路由設置
beego存在三種方式的路由:固定路由、正則路由和自動路由。
- 固定路由:就是全匹配的路由,一個路由對應一個控制器,然後根據用戶請求方法不同去請求控制器中的對應的方法。
- 正則路由:爲了用戶更方便的設置路由,beego參考了sinatra的路由實現,支持多種方式的路由。
- 自動路由:首先需要把路由的控制器註冊到自動路由中,beego會通過反射獲取該結構體中所有的實現方法,然後可以通過api對應自動調用方法(
/:controller/:method
匹配,剩餘的url beego會自動化解析爲參數,保存在this.Ctx.Input.Params
中)。 - 註解路由:用戶無需在router中註冊路由,只需要include相應的controller,然後在controller的method方法上寫上router註釋(//@router)就可以了。beego會自動進行源碼分析,注意,只會在dev模式下進行生成,生成的路由會放在
/routers/commentsRouter.go
文件中。
namespace
通過namespace可以支持更多層次的api,可以前置過濾、條件判斷、無限嵌套namespace。
控制器函數
基於beego的Controller設計可以參考controller文件夾下的文件,只要匿名組合beego.Controller就可以了,如下。而beego.Controller實現了接口beego.ControllerInterface以及一系列的函數。
type xxxController struct {
beego.Controller
}
提前終止運行:比如用戶登陸邏輯沒有通過,就直接終止進程。使用StopRun
可以做到。
type RController struct {
beego.Controller
}
func (this *RController) Prepare() {
this.Data["json"] = map[string]interface{}{"name": "astaxie"}
this.ServeJSON()
this.StopRun()
}
model設計
安裝ORM:go get github.com/astaxie/beego/orm
簡單例子 models.go:
package main
import (
"github.com/astaxie/beego/orm"
)
type User struct {
Id int
Name string
Profile *Profile `orm:"rel(one)"` // OneToOne relation
Post []*Post `orm:"reverse(many)"` // 設置一對多的反向關係
}
type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // 設置一對一反向關係(可選)
}
type Post struct {
Id int
Title string
User *User `orm:"rel(fk)"` //設置一對多關係
Tags []*Tag `orm:"rel(m2m)"`
}
type Tag struct {
Id int
Name string
Posts []*Post `orm:"reverse(many)"`
}
func init() {
// 需要在init中註冊定義的model
orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag))
}
main.go
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8")
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默認使用 default,你可以指定爲其他數據庫
profile := new(Profile)
profile.Age = 30
user := new(User)
user.Profile = profile
user.Name = "slene"
fmt.Println(o.Insert(profile))
fmt.Println(o.Insert(user))
}
註冊模型
如果使用orm.QuerySeter
進行高級查詢的話,這個是必須的。反之,如果只使用Raw查詢和map struct,是無需這一步的。
首先,註冊定義的Model,最佳的設計是有單獨的models.go文件,在它的init函數內完成註冊,比如:
迷你的models.go
package main
import "github.com/astaxie/beego/orm"
type User struct {
Id int
Name string
}
func init(){
orm.RegisterModel(new(User))
}
可以如前文一樣同時註冊多個model。可以使用RegisterModelWithPrefix
,這樣創建的表名會自動帶上前綴。
高級查詢
ORM以QuerySeter來組織查詢,每個返回QuerySeter的方法都會獲得一個新的QuerySeter對象。
QuerySeter使用Filter
組織查詢,字段組合的前後順序依照表的關係。字段的分隔符使用__
雙下劃線。除了描述字段,expr的尾部可以增加操作符以執行對應的sql操作,比如Profile__Age__gt
代表Profile.Age>18
的條件查詢。
mysql中shell常用命令
因爲使用的是mysql,而且經常要用到一些命令,所以在這裏記錄一下
登陸mysql -u root -p
,或者在mysql shell中輸入\connect [scheme://][user[:password]@]<host[:port]|socket>[/schema][?option=value&option=value...]
,例如\connect mysql://wty:[email protected]:3306
來登陸
使用\sql
可以切換到sql模式,這樣子就可以使用常用的sql命令來操作。
遇到的問題
beego中orm怎麼使用
在哪裏定義,是在main裏定義後面使用呢,還是在