這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前面有提到go的mysql操作,但使用其進行資料庫的操作封裝,顯然在實際的開發迭代中有幾大問題存在,首先,sql操作及語句囉嗦而且複雜,其次工作效率也不是很高;如果使用此方法進行資料庫開發,勢必照成過多的代碼冗餘,且使用過程中容易產生各種問題。所以,今天我們一起來看看怎麼使用beego下orm架構來輔佐我們進行mysql資料庫操作。
orm即對象關係映射,通過類或者結構體與資料庫表進行一一對應,今天我們通過簡單的資料庫作業碼來對照說明,且在代碼中有對應操作的解釋:
import ("fmt"_ "github.com/Go-SQL-Driver/MySQL""github.com/astaxie/beego/orm" //對應的beego/orm庫 可以通過 go get來擷取到本地GOPATH路徑下"time")//與資料庫學生表映射的結構體type studentinfo struct {Id int `pk:"auto"`Stuname string `orm:"size(20)"`Stuidentify string `orm:"size(30)"`Stubirth time.TimeStuclass string `orm:"size(30)"`Stumajor string `orm:"size(30)"`}//資料庫連對象需要的資訊var (dbuser string = "root"dbpwd string = "691214"dbname string = "gosql")//初始化ormfunc init() {conn := dbuser + ":" + dbpwd + "@/" + dbname + "?charset=utf8"//組合成串連串<span style="white-space:pre"></span>orm.RegisterModel(new(studentinfo))//註冊表studentinfo 如果沒有會自動建立orm.RegisterDriver("mysql", orm.DR_MySQL) //註冊mysql驅動orm.RegisterDataBase("default", "mysql", conn) //設定conn中的資料庫為預設使用資料庫orm.RunSyncdb("default", false, false)//後一個使用true會帶上很多列印資訊,資料庫操作和建表操作的;第二個為true代表強制建立表}func main() {orm.Debug = true //true 列印資料庫動作記錄資訊dbObj := orm.NewOrm() //執行個體化資料庫操作對象<span style="white-space:pre"></span>//插入資料
sql := fmt.Sprintf("insert into studentinfo(Id,Stuname, Stuidentify, Stubirth, Stuclass, Stumajor)"+" values(1, 'rjx','xxx319928xxx','%s','信管1班','資訊管理與資訊系統')", "1992-01-01 11:11:11")fmt.Println(sql)_, err := dbObj.Raw(sql).Exec()if err != nil {fmt.Println("插入資料至:t_studentInfo出錯")} sql = fmt.Sprintf("insert into studentinfo(Id, Stuname, Stuidentify, Stubirth, Stuclass, Stumajor)"+" values(2, 'qcy','xxx319918xxx','%s','XXX','YYYYYY')", "1992-01-01 11:11:11")_, err = dbObj.Raw(sql).Exec()if err != nil {fmt.Println("插入資料至:t_studentInfo出錯")} //更新資料sql = "update studentinfo set Stuname='qcym' where Id= 2"_, err = dbObj.Raw(sql).Exec()if err != nil {fmt.Println("更新t_studentInfo表出錯")} //通過事務方式來進行資料插入err = dbObj.Begin()sql = fmt.Sprintf("insert into studentinfo(Id, Stuname, Stuidentify, Stubirth, Stuclass, Stumajor)"+" values(3, 'loe','xxx319918xxx','%s','zzzz','TTTT')", "1992-01-01 11:11:11")_, err = dbObj.Raw(sql).Exec()if err != nil {dbObj.Rollback()fmt.Println("插入t_studentInfo表出錯,交易回復")} else {dbObj.Commit()fmt.Println("插入t_studenInfo表成功,事務提交")} //查詢資料庫students := make([]studentinfo, 20)//var students []studentinfosql = "select Id,Stuname,Stuidentify,Stubirth,Stuclass,Stumajor from studentinfo"fmt.Println(sql)num, er := dbObj.Raw(sql).QueryRows(&students)if er != nil {fmt.Println("查詢學生資訊出錯")} else {fmt.Printf("從t_studenInfo表中共查詢到記錄:%d條\n", num)for index, _ := range students {fmt.Printf("第%d個學生個人資訊:", index+1)fmt.Printf("姓名:%s,社會安全號碼:%s,出生日期:%s,班級:%s,專業:%s", students[index].Stuname, students[index].Stuidentify, students[index].Stubirth, students[index].Stuclass, students[index].Stumajor)}}//<span style="white-space:pre"></span>}
以上orm操作基本完成了對資料庫的增刪改插操作,但共同特點相信都知道,就是都是使用sql語句來完成的,接下來我們完全使用結構體來成對應的功能。這樣操作起來會顯得更加方便,相當於在三成架構中已經幫我完全搭建好了dao,資料庫的操作層,咱只需要在此上再做簡單的封裝就行。
下面是使用結構體來完成同上的功能:
func main() {orm.Debug = truedbObj := orm.NewOrm()var stuPtr *studentinfo = new(studentinfo)stuPtr.Stuname = "xiaom"stuPtr.Stubirth = time.Now()stuPtr.Stuclass = "一年級1班"stuPtr.Stuidentify = "1234"stuPtr.Stumajor = "電腦"tm := time.Now()var studentus = []studentinfo{{Stuname: "xd", Stuidentify: "1235", Stubirth: tm, Stuclass: "一年級2班", Stumajor: "資料庫"},{Stuname: "xx", Stuidentify: "1236", Stubirth: tm, Stuclass: "一年級3班", Stumajor: "網路"},{Stuname: "xn", Stuidentify: "1237", Stubirth: tm, Stuclass: "一年級4班", Stumajor: "C語言"},{Stuname: "xb", Stuidentify: "1238", Stubirth: tm, Stuclass: "一年級5班", Stumajor: "JAVA"},{Stuname: "xq", Stuidentify: "1239", Stubirth: tm, Stuclass: "一年級6班", Stumajor: "C++"},}var err error_, err = dbObj.Insert(stuPtr)//單條記錄插入if err != nil {fmt.Printf("插入學生:%s資訊出錯。\n", stuPtr.Stuname)} else {fmt.Printf("插入學生:%s資訊成功。\n", stuPtr.Stuname)}var num int64num, err = dbObj.InsertMulti(5, studentus)//多條記錄插入if err != nil {fmt.Printf("插入%d個學生資訊錯誤,%d個學會資訊成功。\n", 5-num, num)} else {fmt.Printf("成功插入%d學生資訊。\n", num)}studentR := new(studentinfo)//記錄讀取,需要指定主鍵studentR.Id = 6err = dbObj.Read(studentR)if err != nil {fmt.Printf("讀取ID:%d的學生資訊失敗", studentR.Id)} else {fmt.Printf("ID:%d的學生個人資訊為:\n",studentR.Id)fmt.Println(studentR)}studentU := new(studentinfo)studentU.Id = 5studentU.Stumajor = "管理科學與工程"_, err = dbObj.Update(studentU, "Stumajor")//記錄更新if err != nil {fmt.Printf("更新ID:%d的學生資訊失敗。", studentU.Id)} else {fmt.Printf("更新ID:%d的學生資訊成功。", studentU.Id)}///刪除 dbObj.Delete(studentU)//} 以上為beego下操作mysql資料庫的基本用法,希望對大家有所協助,能達到同樣目地的還有beedb,有時間可以參考下。