前面有提到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.Time Stuclass string `orm:"size(30)"` Stumajor string `orm:"size(30)"` } //数据库连对象需要的信息 var ( dbuser string = "root" dbpwd string = "691214" dbname string = "gosql" ) //初始化orm func 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 []studentinfo sql = "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 = true dbObj := 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 int64 num, 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 = 6 err = 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 = 5 studentU.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,有时间可以参考下。