go编程之beego\orm使用

xixionedream · · 34227 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

           前面有提到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,有时间可以参考下。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:xixionedream

查看原文:go编程之beego\orm使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

34227 次点击  ∙  2 赞  
加入收藏 微博
4 回复  |  直到 2019-01-14 19:41:13
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传