接着上篇来写《和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...是关于数据库默认信息
今天到此结束,你们有什么不明白的, 欢迎联系我!
下篇咱们要完成下面三个任务:
一、控制器的使用
二、路由的使用