接着上篇來寫《和lock一塊兒學beego 博客系統開發爲例(二)》mysql
這篇主要完成如下事項:git
1.模型裏如何建立方法github
2. 數據庫的引用sql
3. beego的配置文件使用數據庫
1、模型裏如何建立方法app
在上篇中,咱們其實已經在模型裏創建了方法,init()這個方法比較特殊,go語言中會自動加載編譯其方法;除了這些方法外,咱們是否是也要創建一些經常使用對模型的操做方法,以article表爲例:tcp
咱們要爲博客文章添加三個方法:url
一、博客的添加.net
二、博客的編輯debug
三、博客詳情獲取
四、博客列表及分頁
經過這幾個方法的編寫,會對模型有更多的瞭解,在這裏咱們用ORM來操做表。
一、博客的添加:AddArticle
在上篇中咱們創建了article.go模型,在 models下面。
func AddArticle(updArt Article) (int64, error) { o := orm.NewOrm() o.Using("default") art := new(Article) art.Title = updArt.Title art.Uri = updArt.Uri art.Keywords = updArt.Keywords art.Summary = updArt.Summary art.Content = updArt.Content art.Author = updArt.Author art.Created = time.Now().Unix() art.Viewnum = 1 art.Status = updArt.Status id, err := o.Insert(art) return id, err }
說明:方法的參數是artilce類型也就是前面定義的struct;返回是插入的ID;在方法體中,咱們首先要新建一個ORM實例,而後經過調用其屬性來賦值,直到insert。
是否是很簡單??
二、博客的編輯:UpdateArticle
看了上面的添加操做,編輯是否是也相似?
func UpdateArticle(id int, updArt Article) error { o := orm.NewOrm() o.Using("default") art := Article{Id: id} art.Title = updArt.Title art.Uri = updArt.Uri art.Keywords = updArt.Keywords art.Summary = updArt.Summary art.Content = updArt.Content art.Author = updArt.Author art.Status = updArt.Status _, err := o.Update(&art) return err }
說明:既然是編輯,確定要有條件,beego默認是以ID來做條件的,賦值,update
三、博客的詳情獲取:GetArticle
經過ID來獲取文章內容
func GetArticle(id int) (Article, error) { o := orm.NewOrm() o.Using("default") art := Article{Id: id} err := o.Read(&art) return art, err }
其實不用說明,看程序也明瞭,經過ID獲取,讀取詳情
四、博客列表及分頁:ListArticle
博客列表的有點複雜,不過也簡單,咱們爲了寫個通用的列表分頁,博客的獲取確定也是有條件的,有頁數,數據偏移數等
func ListArticle(condArr map[string]string, page int, offset int) (num int64, err error, art []Article) { o := orm.NewOrm() qs := o.QueryTable("article") cond := orm.NewCondition() if condArr["title"] != "" { cond = cond.And("title__icontains", condArr["title"]) } if condArr["keywords"] != "" { cond = cond.Or("keywords__icontains", condArr["keywords"]) } if condArr["status"] != "" { //status, _ := strconv.Atoi(condArr["status"]) cond = cond.And("status", condArr["status"]) } qs = qs.SetCond(cond) if page < 1 { page = 1 } if offset < 1 { offset = 10 } start := (page - 1) * offset var articles []Article num, err1 := qs.Limit(offset, start).All(&articles) return num, err1, articles }
說明: 咱們在給條件定義了一個map類型,字符串類型的,方法體中,能夠根據傳遞的條件,進行篩選,同時用到beego的高級查詢方法。
順便補充一個方法,模板中分頁,還要用到分頁總數,與列表方法很相似
func CountArticle(condArr map[string]string) int64 { o := orm.NewOrm() qs := o.QueryTable("article") cond := orm.NewCondition() if condArr["title"] != "" { cond = cond.And("title__icontains", condArr["title"]) } if condArr["keywords"] != "" { cond = cond.Or("keywords__icontains", condArr["keywords"]) } if condArr["status"] != "" { cond = cond.And("status", condArr["status"]) } num, _ := qs.SetCond(cond).Count() return num }
好了,到此,應該對model方法的定義有了解了吧;寫相似的模型應該也差很少。
2、 數據庫的引用
上面介紹了在模型中怎麼寫方法來操做表,但數據庫怎麼引用鏈接了?beego提供多種數據庫驅動,在這裏咱們以mysql爲例。
在每一個模型的開頭,咱們都會引用:
"github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql"
一個是引用orm來操做,一個引用mysql驅動。
咱們在model中init方法中也能夠註冊驅動,如上面的article方法,咱們能夠這樣:
func init() { orm.RegisterDriver("mysql", orm.DRMySQL) orm.RegisterDataBase("default", "mysql", "root:@/blog?charset=utf8", 30) orm.RegisterModel(new(Article)) orm.RunSyncdb("default", false, true) }
具體的意思能夠查看beego文檔。
若是有許多個模型,難道咱們要在每一個模型的初始化方法註冊驅動??其實咱們能夠在其它地方
在src/blog下新建一個文件夾,initial文件夾,這個文件主要存放咱們初始化的一些文件,像數據庫這類就能夠放在裏面sql.go:
package initial import ( "fmt" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) func InitSql() { user := beego.AppConfig.String("mysqluser") passwd := beego.AppConfig.String("mysqlpass") host := beego.AppConfig.String("mysqlurls") port, err := beego.AppConfig.Int("mysqlport") dbname := beego.AppConfig.String("mysqldb") if nil != err { port = 3306 } orm.Debug = true orm.RegisterDriver("mysql", orm.DRMySQL) //orm.RegisterDataBase("default", "mysql", "root:@/blog?charset=utf8", 30) orm.RegisterDataBase("default", "mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", user, passwd, host, port, dbname)) }
說明:引用mysql驅動,讀取beego配置文件,在開發環境下,要以開放debug爲true,在生產環境下,必定要刻去掉。
爲了方便,咱們在Inital下再創建一個文件,方便全引用
package initial func init() { InitSql() InitTplFunc() }
InitTplFunc這個方法是模板中自定義方法引用,在這裏先不介紹。
這樣在Models下每一個模型就不用定義引用了驅動了。怎麼引用了,固然在main.go 引用
package main import ( _ "blog/routers" _ "blog/initial" //"fmt" //"strconv" "github.com/astaxie/beego" //"github.com/astaxie/beego/context" )
數據庫的引用到此,也就結束了。你們有什麼不是明白,能夠聯繫我。
3、 beego的配置文件使用
在上面的數據庫中,咱們也用到配置文件,只是沒有介紹。
如何引用配置文件裏參數,能夠使用:
beego.AppConfig.String(xx) beego.AppConfig.Int(xx)
配置文件在conf/app.conf下
appname = blog httpport = 8080 runmode = dev copyrequestbody = true mysqluser = "root" mysqlpass = "" mysqlurls = "127.0.0.1" mysqldb = "blog" mysqlport = "3306"
appname: 項目名稱
httpport:端口號
runmode:dev開發模式
copyrequestbody:獲取內容
mysql...是關於數據庫默認信息
今天到此結束,你們有什麼不明白的, 歡迎聯繫我!
下篇咱們要完成下面三個任務:
一、控制器的使用
二、路由的使用