這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
beego
入門體驗
通過beego
內建bee
工具bee run
建立完一個項目以後。那麼便可以在這麼目錄結構上完成我的項目。其中,少不了資料庫操作和路由。
我們在原有的基礎上建立一個資料庫article
的資料庫表。結構如下:
CREATE TABLE IF NOT EXISTS `article` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, `client` varchar(200) NOT NULL, `url` varchar(200) NOT NULL, `notes` text NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=9 ;
建完資料庫以後,需要有一個想對應的模型,在models
的目錄下的models.go
的檔案下加入如下代碼:
import ( "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql")type Article struct { Id int `form:"-"` Name string `form:"name,text,name:" valid:"MinSize(5);MaxSize(20)"` Client string `form:"client,text,client:"` Url string `form:"url,text,url:"` Notes string `form:"url,text,notes:"`}func init() { orm.RegisterDriver("mysql", orm.DR_MySQL) orm.RegisterDataBase("default", "mysql", "root:123456789@/beego_learn?charset=utf8") orm.RegisterModel(new(Article))}
在model
中定義我們的資料庫結構,並且完成資料庫的初始化串連。
建立完成以後,預設有一個default.go
的控制器。那麼我們在建立一個測試的控制器,於是,我們建立一個test.go
的控制器檔案。test.go
的實現大概如下:
package controllersimport ( "fmt" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" "reflect" //"strconv" models "wanghuixin/models")type TtController struct { beego.Controller}func (c *TtController) Get() { orm.Debug = true o := orm.NewOrm() o.Using("default") // 預設使用 default,你可以指定為其他資料庫 var maps []orm.Params var Article models.Article //res, err := o.QueryTable("Article").Filter("id", "name").All(&Article) num, err := o.QueryTable("Article").Values(&maps, "id", "name", "client", "url", "notes") if err == orm.ErrNoRows { fmt.Println("查詢不到") } else if err == orm.ErrMissPK { fmt.Println("找不到主鍵") } else { fmt.Println(Article.Id, Article.Name) fmt.Println("res是:", reflect.TypeOf(maps)) fmt.Println(num) for _, v := range maps { fmt.Println(v) } c.Data["m"] = maps } c.TplNames = "index.tpl"}func (c *MainController) Read() { orm.Debug = true o := orm.NewOrm() o.Using("default") //var Article models.Article //err := o.QueryTable("Article").Filter("name").One(&Article) id := c.Ctx.Input.Param(":ids") intid, err := strconv.Atoi(id) user := models.Article{Id: intid} err = o.Read(&user) if err == orm.ErrMultiRows { // 多條的時候報錯 fmt.Printf("Returned Multi Rows Not One") } if err == orm.ErrNoRows { // 沒有找到記錄 fmt.Printf("Not row found") } fmt.Println("id 是", id) c.Data["m"] = user c.TplNames = "read.tpl"}Get方法是預設擷取資料表全部資料,Read是根據ID擷取一條資料。然後,我們需要一個路由。我們在routers目錄下建立一個tt.go。tt.go代碼如下:package routersimport ( "github.com/astaxie/beego" "quantou/controllers")func init() { beego.Router("/read", &controllers.TtController{}, "*:Get") beego.Router("/read/:ids([0-9]+)", &controllers.TtController{}, "*:Read")}
這樣,就可以將相應的訪問地址分配到相應的系統方法裡了。也可以將上面代碼追加到預設的models.go
檔案。只是分開更方便管理。
當然,還可以在路由中對相應的控制器進行自動註冊,那樣,就不再需要為每個方法分別配置。方法如下:
func init() { beego.AutoRouter(&controllers.ObjectController{})}
那麼 beego
就會通過反射擷取該結構體中所有的實現方法,你就可以通過如下的方式訪問到對應的方法中:
/object/login
調用 ObjectController
中的 Login
方法
/object/logout
調用 ObjectController
中的 Logout
方法
除了首碼兩個/:controller/:method
的匹配之外,剩下的 url beego
會幫你自動化解析為參數,儲存在 this.Ctx.Input.Params
當中:
/object/blog/2013/09/12
調用 ObjectController
中的 Blog
方法,參數如下:map[0:2013 1:09 2:12]