前面有提到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"//组合成连接串
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() //实例化数据库操作对象
//插入数据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)
}
}
//
}
以上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,有时间可以参考下。
有疑问加站长微信联系(非本文作者)