golang?beego框架路由ORM增刪改查完整案例
程序運(yùn)行前加載
1.導(dǎo)包前面加下劃線,運(yùn)行前加載
2.把要加載的寫在init函數(shù)里面
路由設(shè)置
路由的作用:根據(jù)不同的請(qǐng)求指定不同的控制器
路由函數(shù):
beego.Router("/path",&controller.MainController{})
函數(shù)參數(shù):
先分析一下Url地址由哪幾部分組成?
http://192.168.110.71:8080/index http://地址:端口/資源路徑
第一個(gè)參數(shù):資源路徑,也就是 / 后面的內(nèi)容
第二個(gè)參數(shù):需要指定的控制器指針
了解上面的內(nèi)容之后我們來(lái)看幾個(gè)簡(jiǎn)單的例子:
beego.Router("/", &controllers.MainController{}) beego.Router("/index", &controllers.IndexController{}) beego.Router("/login", &controllers.LoginController{})
高級(jí)路由設(shè)置
一般在開發(fā)過(guò)程中,我們基本不使用beego提供的默認(rèn)請(qǐng)求訪問(wèn)方法,都是自定義相應(yīng)的方法。那我們來(lái)看一下如何來(lái)自定義請(qǐng)求方法。
自定義請(qǐng)求方法需要用到Router的第三個(gè)參數(shù)。這個(gè)參數(shù)是用來(lái)給不同的請(qǐng)求指定不同的方法。具體有如下幾種情況。
一個(gè)請(qǐng)求訪問(wèn)一個(gè)方法(也是最常用的),請(qǐng)求和方法之間用 : 隔開,不同的請(qǐng)求用 ; 隔開:
beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")
可以多個(gè)請(qǐng)求,訪問(wèn)一個(gè)方法 ,請(qǐng)求之間用 , 隔開,請(qǐng)求與方法之間用 : 隔開:
beego.Router("/api",&RestController{},"get,post:ApiFunc")
所有的請(qǐng)求訪問(wèn)同一個(gè)方法,用 * 號(hào)代表所有的請(qǐng)求,和方法之間用 : 隔開:
beego.Router("/api/list",&RestController{},"*:ListFood")
如果同時(shí)存在 * 和對(duì)應(yīng)的 HTTP請(qǐng)求,那么優(yōu)先執(zhí)行 HTTP請(qǐng)求所對(duì)應(yīng)的方法,例如同時(shí)注冊(cè)了如下所示的路由:
beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")
那么當(dāng)遇到 Post 請(qǐng)求的時(shí)候,執(zhí)行 PostFunc 而不是 AllFunc。
如果用了自定義方法之后,默認(rèn)請(qǐng)求將不能訪問(wèn)。
beego-ORM初始化
ORM-----對(duì)象關(guān)系映射
安裝ORM+導(dǎo)包
go get github.com/astaxie/beego/orm import "github.com/astaxie/beego/orm"
定義結(jié)構(gòu)體
相當(dāng)于django中的model類
type User struct{ Id int Name string PassWord string }
beego支持的數(shù)據(jù)庫(kù)
mysql,sqlite3,postgersql
驅(qū)動(dòng)如下:
import ( _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" )
連接數(shù)據(jù)庫(kù)
用RegisterDataBase()函數(shù),第一個(gè)參數(shù)為數(shù)據(jù)庫(kù)別名,也可以理解為數(shù)據(jù)庫(kù)的key值,項(xiàng)目中必須有且只能有一個(gè)別名為 default 的連接,第二個(gè)參數(shù)是數(shù)據(jù)庫(kù)驅(qū)動(dòng),這里我們用的MySQL數(shù)據(jù)庫(kù),所以以MySQL驅(qū)動(dòng)為例,第三個(gè)參數(shù)是連接字符串,和傳統(tǒng)操作數(shù)據(jù)庫(kù)連接字符串一樣
格式為:用戶名:密碼@tcp(ip:port)/數(shù)據(jù)庫(kù)名稱?編碼方式
代碼如下:
orm.RegisterDataBase("default","mysql","root:@tcp(127.0.0.1:3306)/class1? charset=utf8")
注意:ORM只能操作表,不能操作數(shù)據(jù)庫(kù),所以我們連接的數(shù)據(jù)庫(kù)要提前在MySQL終端創(chuàng)建好。
注冊(cè)數(shù)據(jù)庫(kù)表
用orm.RegisterModel()函數(shù),參數(shù)是結(jié)構(gòu)體對(duì)象,如果有多個(gè)表,可以用 , 隔開,多new幾個(gè)對(duì)象:
orm.RegisterModel(new(User))
生成表
用orm.RunSyncdb()函數(shù),這個(gè)函數(shù)有三個(gè)參數(shù),
第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)的別名和連接數(shù)據(jù)庫(kù)的第一個(gè)參數(shù)相對(duì)應(yīng)。
第二個(gè)參數(shù)是是否強(qiáng)制更新,一般我們寫的都是false,如果寫true的話,每次項(xiàng)目編譯一次數(shù)據(jù)庫(kù)就會(huì)被清空一次,fasle的話會(huì)在數(shù)據(jù)庫(kù)發(fā)生重大改變(比如添加字段)的時(shí)候更新數(shù)據(jù)庫(kù)。
第三個(gè)參數(shù)是用來(lái)說(shuō),生成表過(guò)程是否可見,如果我們寫成課件,那么生成表的時(shí)候執(zhí)行的SQL語(yǔ)句就
會(huì)在終端看到。反之看不見。代碼如下:
orm.RunSyncdb("default",false,true)
完整案例
import "github.com/astaxie/beego/orm" type User struct { Id int Name string Passwd string } func init(){ //1.連接數(shù)據(jù)庫(kù) orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8") //2.注冊(cè)表 orm.RegisterModel(new(User)) // 3.生成表 // 1.數(shù)據(jù)庫(kù)別名 // 2.是否強(qiáng)制更新 // 3.創(chuàng)建表過(guò)程是否可見 orm.RunSyncdb("default",false,true) }
因?yàn)檫@里我們把ORM初始化的代碼放到了 models包的init()函數(shù)里面,所以如果我們想讓他執(zhí)行的話就需要在main.go里面加入這么一句代碼:
import _ "classOne/models"
ORM增刪改查
在執(zhí)行ORM的操作之前需要先把ORM包導(dǎo)入,但是GoLand會(huì)自動(dòng)幫我們導(dǎo)包,也可以手動(dòng)導(dǎo)包
go get github.com/astaxie/beego/orm import "github.com/astaxie/beego/orm"
插入
先獲取一個(gè)ORM對(duì)象,用orm.NewOrm()即可獲得
o := orm.NewOrm() var user User //定義一個(gè)要插入數(shù)據(jù)庫(kù)的結(jié)構(gòu)體對(duì)象 user.Name = "itcast" //給定義的對(duì)象賦值 user.Passwd = "heima" //執(zhí)行插入操作,o.Insert()插入,參數(shù)是結(jié)構(gòu)體對(duì)象,返回值是插入的id和錯(cuò)誤信息。 id, err := o.Insert(&user) if err == nil { fmt.Println(id) }
注意:這里不用給Id賦值,因?yàn)榻ū淼臅r(shí)候我們沒(méi)有指定主鍵,ORM默認(rèn)會(huì)以變量名為Id,類型為int的字段當(dāng)主鍵
查詢
查詢,用o.Read(),第一個(gè)參數(shù)是對(duì)象地址,第二個(gè)參數(shù)是指定查詢字段,返回值只有錯(cuò)誤信息。
o := orm.NewOrm() //1.要先獲得一個(gè)ORM對(duì)象 var user User //2.定義一個(gè)要獲取數(shù)據(jù)的結(jié)構(gòu)體對(duì)象 user.Name = "itcast" //3.給結(jié)構(gòu)體對(duì)象賦值,相當(dāng)于給查詢條件賦值 err := o.Read(&user,"Name") //4.查詢,用o.Read() if err != nil{ beego.Info("查詢數(shù)據(jù)錯(cuò)誤",err) return }
注意:如果查詢字段是查詢對(duì)象的主鍵的話,可以不用指定查詢字段
更新
執(zhí)行更新操作,用o.Update()函數(shù),參數(shù)是結(jié)構(gòu)體對(duì)象指針,返回值是更新的條目數(shù)和錯(cuò)誤信息
o := orm.NewOrm() //1.要先獲得一個(gè)ORM對(duì)象 var user User //2.定義一個(gè)要獲取數(shù)據(jù)的結(jié)構(gòu)體對(duì)象 user.Name = "itcast" //3.給結(jié)構(gòu)體對(duì)象賦值,相當(dāng)于給查詢條件賦值 err := o.Read(&user) //4.查詢更新的數(shù)據(jù)是否存在 if err != nil{ beego.Info("查詢數(shù)據(jù)錯(cuò)誤",err) return } user.Name = "jeff" //5.如果查找到了要更新的對(duì)象,就給這個(gè)對(duì)象賦新值 count,err=o.Update(&user) //6. 更新操作 if err != nil{ beego.Info("更新數(shù)據(jù)錯(cuò)誤",err) return }
刪除
執(zhí)行刪除操作,用的方法是o.Delete(),參數(shù)是刪除的結(jié)構(gòu)體對(duì)象,返回值是刪除的條目數(shù)和錯(cuò)誤信息
o := orm.NewOrm() //1.要先獲得一個(gè)ORM對(duì)象 var user User //2.定義一個(gè)要獲取數(shù)據(jù)的結(jié)構(gòu)體對(duì)象 user.Id = 1 //3.給結(jié)構(gòu)體對(duì)象賦值,相當(dāng)于給查詢條件賦值 num, err := o.Delete(&User{Id: 1}) if err == nil { fmt.Println(num) }
案例
注冊(cè)
在router.go文件的init()函數(shù)中加下面這行代碼: 路由文件
beego.Router("/register1", &controllers.MainController{})
Controllers/default.go業(yè)務(wù)邏輯中:
func (c *MainController) Get() { c.Data["data"] = "get請(qǐng)求" c.TplName = "register.html" } func (c *MainController) Post() { c.Data["name"] = "jeff" c.TplName = "register.html" userName := c.GetString("userName") passwd := c.GetString("passwd") beego.Info("用戶名",userName) beego.Info("密碼",passwd) if userName != "" || passwd != ""{ c.Redirect("/login",400) } c.TplName = "register.html" }
Views/register.html視圖文件中:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊(cè)</title> </head> <body> <div style="position:absolute;left:50%; top:50%;"> <form action="/register1" method="post"> 用戶名:<input type="text" name="userName"> <p></p> 密碼:<input type="password" name="passwd"> <p></p> <input type="submit" value="注冊(cè)"> </form> </div> </body> </html>
案例2
路由:
beego.Router("/addAritcle", &controllers.MainController{},"post:AddAritcle;get:Index")
default業(yè)務(wù)邏輯:
func (c*MainController) AddAritcle() { c.Data["name"] = c.GetString("userName") c.Data["pwd"] = c.GetString("passwd") beego.Info("用戶名:",c.Data["name"]) beego.Info("密碼",c.Data["pwd"]) c.TplName = "success.html" } func (c*MainController) Index() { c.TplName = "addArticle.html" }
view視圖
addArticle.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>成功</title> </head> <body> <p style="font-size: 70px;color: brown">成功?。。?lt;/p> <p>用戶名:{{.name}}</p> <p>密碼:{{.pwd}}</p> </body> </html>
Success.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>成功</title> </head> <body> <p style="font-size: 70px;color: brown">成功?。?!</p> <p>用戶名:{{.name}}</p> <p>密碼:{{.pwd}}</p> </body> </html>
以上就是golang beego框架路由ORM增刪改查完整案例的詳細(xì)內(nèi)容,更多關(guān)于golang beego框架路ORM增刪改查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Go語(yǔ)言導(dǎo)出內(nèi)容到Excel的方法
這篇文章主要介紹了Go語(yǔ)言導(dǎo)出內(nèi)容到Excel的方法,涉及Go語(yǔ)言操作excel的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02golang中snappy的使用場(chǎng)合實(shí)例詳解
在java 和go語(yǔ)言 大字符傳達(dá)的時(shí)候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場(chǎng)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12Golang?throttled基于GCRA速率限制庫(kù)使用探索
這篇文章主要為大家介紹了Golang?throttled基于GCRA速率限制庫(kù)使用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01淺談Go語(yǔ)言多態(tài)的實(shí)現(xiàn)與interface使用
如果大家系統(tǒng)的學(xué)過(guò)C++、Java等語(yǔ)言以及面向?qū)ο蟮脑?,相信?yīng)該對(duì)多態(tài)不會(huì)陌生。多態(tài)是面向?qū)ο蠓懂牣?dāng)中經(jīng)常使用并且非常好用的一個(gè)功能,它主要是用在強(qiáng)類型語(yǔ)言當(dāng)中,像是Python這樣的弱類型語(yǔ)言,變量的類型可以隨意變化,也沒(méi)有任何限制,其實(shí)區(qū)別不是很大2021-06-06go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門
這篇文章主要為大家介紹了go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Golang內(nèi)存泄漏場(chǎng)景以及解決方案詳析
golang中內(nèi)存泄露的發(fā)現(xiàn)與排查一直是來(lái)是go開發(fā)者頭疼的一件事,下面這篇文章主要給大家介紹了關(guān)于Golang內(nèi)存泄漏場(chǎng)景以及解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01