go xorm框架的使用


Posted in Golang onMay 22, 2021

一、创建数据库连接

xorm支持单引擎和多引擎,多引擎的场景对于初学者来说,没有必要考虑,所以我们主要学习的是单引擎的数据库连接,为了方便检查SQL,需要启用打印功能,默认不开启

var engine *xorm.Engine

func main() {
	var err error
	engine, err = xorm.NewEngine("mysql", "root:123456@tcp(127.0.0.1:3306)/myschool?charset=utf8")
	if err != nil {
		log.Println(err)
	}
    // 控制台打印出生成的SQL语句
	engine.ShowSQL(true)
}

二、操作mysql数据库

查询

建表语句

CREATE TABLE `student`  (
  `id` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `gradeid` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

CREATE TABLE `grade`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gradename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

struct结构体

student.go

type Student struct {
	Id      string `orm:"id,primary" json:"id"`
	Name    string `orm:"name"       json:"name"`
	Age     int    `orm:"age"        json:"age"`
	Gradeid int    `orm:"gradeid"    json:"gradeid"`
}

grade.go

type Grade struct {
	Id        int    `orm:"id,primary" json:"id"`
	Gradename string `orm:"gradename"  json:"gradename"`
}

1、Get方法

Get方法用于获取单条数据,如:

结合Where查询 ,写法很多,主要是刚入门,都可以尝试一下。最终的实现都是一个意思

var stu student.Student
has, err := engine.Where("id=?", "1").Get(&stu)
  
stu := new(student.Student)
has, err := engine.Where("id=?", "1").Get(stu)
  
stu := student.Student{}
has, err := engine.Where("id=?", "1").Get(&stu)
  
stu := &student.Student{}
has, err := engine.Where("id=?", "1").Get(stu)
  
if err != nil {
  log.Println(err)
}
log.Println("是否存在:",has)
log.Println(stu)

结构体中已有的非空数据查询

stu := &student.Student{Id:"1"}
has, err := engine.Get(stu)
if err != nil {
   log.Println(err)
}
log.Println("是否存在:",has)
log.Println(stu)

has返回一个boolean类型,表明数据是否存在,err接收如果在查询中产生的错误

2、Exist方法

Exist方法用于判断数据是否存在,Get方法是以id字段举例,那么现在就以name字段举例

下面的写法也很怪异,猜测着去写,很多东西都可以拓展开,刚入门,看啥都很神奇,随便举几个例子,后面慢慢的去尝试

has, err := engine.Where("name=?", "少杰").Exist(&student.Student{})

has, err := engine.Table(&student.Student{}).Where("name=?", "少杰").Exist()

has, err := engine.Exist(&student.Student{Name: "少杰"})
if err != nil {
    log.Println(err)
}
log.Println("是否存在:", has)

3、Find方法

Find方法用于查询多条数据 ,Find方法的第一个参数为slice的指针或Map指针,即为查询后返回的结果,第二个参数可选,为查询的条件struct的指针。

stu := make([]student.Student, 0)
// Cols 查询指定字段
// Limit 分页查询 (显示的条数,从第几个开始)
err := engine.Where("id=?", "1").Cols("name").Limit(10, 0).Find(&stus)
if err != nil {
    log.Println(err)
}
log.Println("查询到的信息:", stu)

查询时可以加入各种条件,也可以不加。不加时err := engine.Find(&stus)查询所有,如果只选择单个字段,也可使用非结构体的Slice

var strings []string
// Table 需要操作的表名称
err := engine.Table("student").Cols("id").Find(&strings)
if err != nil {
    log.Println(err)
}
log.Println("查询到的信息:",strings)

4、Join方法

第一个参数为连接类型,当前支持INNER, LEFT OUTER, CROSS中的一个值, 第二个参数为string类型的表名,表对应的结构体指针或者为两个值的[]string,表示表名和别名, 第三个参数为关联键。

每个学生只在一个班级出现,所以对应的结构体应该加上xorm的index标记

type Student struct {
	Id      string `orm:"id,primary" json:"id"`
	Name    string `orm:"name"       json:"name"`
	Age     int    `orm:"age"        json:"age"`
	Gradeid int    `orm:"gradeid"    json:"gradeid" xorm:"index"`
}
type Grade struct {
	Id        int    `orm:"id,primary" json:"id"`
	Gradename string `orm:"gradename"  json:"gradename"`
}

如果我们想查询出两张表的具体数据,还需要借助xorm的extend关键字,类似于java中的vo,而extend关键字的用处就是读取的数据引用到struct,结构体中extends标记对应的结构顺序应和最终生成SQL中对应的表出现的顺序相同。

type Student struct {
	modle.Student `xorm:"extends"`
	modle.Grade   `xorm:"extends"`
}

// 查询年纪时三年纪的学生
stu := make([]Student, 0)
err := engine.Where("gradeid=?", "3").Join("INNER", "grade", "grade.id = student.gradeid").Find(&stu)
if err != nil {
    log.Println(err)
}
log.Println("查询到的信息:" , stu)

因为查询到的数据格式时数组,如果想获取查询出的数据,可以采取循环数组的方式去遍历

for _, value := range stu {
    log.Println("value:", value)
}

或者通过下标去操作stu[0]去获取学生的信息

5、Iterate方法

Iterate方法提供逐条执行查询到的记录的方法,它所能使用的条件和Find方法完全相同

// Iterate 方法
err := engine.Where("age > ? ", 10).Iterate(new(modle.Student), func(i int, bean interface{}) error {
    stu := bean.(*modle.Student)
    log.Println("查询到的信息:", stu, i)
    return nil
})

6、Count方法

统计数据使用Count方法,Count方法的参数为struct的指针并且成为查询条件。

// Count 判断有几个
stuCount := new(modle.Student)
total, err := engine.Where("age >?", 10).Count(stuCount)
if err != nil {
    log.Println(err)
}
log.Println("年龄大于10的有", total, "个")

7、Rows方法

Rows方法和Iterate方法类似,提供逐条执行查询到的记录的方法,不过Rows更加灵活好用。

stu := new(modle.Student)
rows, err := engine.Where("age >?", 10).Rows(stu)
if err != nil {
    log.Println(err)
}
defer rows.Close()
for rows.Next() {
    err = rows.Scan(stu)
    if err != nil {
        log.Println(err)
    }
    log.Println("========", stu)
}

插入

Created可以让您在数据插入到数据库时自动将对应的字段设置为当前时间

engine.TZLocation, _ = time.LoadLocation("Asia/Shanghai") 改变xorm的时区

type Student struct {
	Id      string `orm:"id,primary" json:"id"`
	Name    string `orm:"name"       json:"name"`
	Age     int    `orm:"age"        json:"age"`
	Gradeid int    `orm:"gradeid"    json:"gradeid" xorm:"index"`
	CreatedTime time.Time `xorm:"created"`
}
// 创建一个结构体
var stuInsert modle.Student
stuInsert.Id = "3"
stuInsert.Name = "王五"
stuInsert.Age = 20
engine.Insert(&stuInsert)

更新

// 将id=1的用户名称修改为少杰
var stuUpdate modle.Student
stuUpdate.Name = "少杰"
affected, err := engine.Where("id=?", "1").Update(&stuUpdate)
if err != nil {
    log.Println(err)
}
log.Println("是否更新成功:", affected)

删除

// 删除一个id=3的学生
var stuDelete modle.Student
affected, err := engine.Where("id=?", "3").Delete(&stuDelete)
if err != nil {
    log.Println(err)
}
log.Println("是否删除成功:", affected)

Column属性定义

 

name 当前field对应的字段的名称,可选,如不写,则自动根据field名字和转换规则命名,如与其它关键字冲突,请使用单引号括起来。
pk 是否是Primary Key,如果在一个struct中有多个字段都使用了此标记,则这多个字段构成了复合主键,单主键当前支持int32,int,int64,uint32,uint,uint64,string这7种Go的数据类型,复合主键支持这7种Go的数据类型的组合。
当前支持30多种字段类型,详情参见本文最后一个表格 字段类型
autoincr 是否是自增
[not ]null 或 notnull 是否可以为空
unique或unique(uniquename) 是否是唯一,如不加括号则该字段不允许重复;如加上括号,则括号中为联合唯一索引的名字,此时如果有另外一个或多个字段和本unique的uniquename相同,则这些uniquename相同的字段组成联合唯一索引
index或index(indexname) 是否是索引,如不加括号则该字段自身为索引,如加上括号,则括号中为联合索引的名字,此时如果有另外一个或多个字段和本index的indexname相同,则这些indexname相同的字段组成联合索引
extends 应用于一个匿名成员结构体或者非匿名成员结构体之上,表示此结构体的所有成员也映射到数据库中,extends可加载无限级
- 这个Field将不进行字段映射
-> 这个Field将只写入到数据库而不从数据库读取
<- 这个Field将只从数据库读取,而不写入到数据库
created 这个Field将在Insert时自动赋值为当前时间
updated 这个Field将在Insert或Update时自动赋值为当前时间
deleted 这个Field将在Delete时设置为当前时间,并且当前记录不删除
version 这个Field将会在insert时默认为1,每次更新自动加1
default 0或default(0) 设置默认值,紧跟的内容如果是Varchar等需要加上单引号
json 表示内容将先转成Json格式,然后存储到数据库中,数据库中的字段类型可以为Text或者二进制
comment 设置字段的注释(当前仅支持mysql)

xorm框架简单的使用,慢慢学习,慢慢进步,加油少年!相信自己,本文章内容可以参考文档 http://xorm.topgoer.com/

以上就是go xorm框架的使用的详细内容,更多关于go xorm框架的资料请关注三水点靠木其它相关文章!

Golang 相关文章推荐
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang语言指针操作
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
Golang实现AES对称加密的过程详解
May 20 #Golang
go语言基础 seek光标位置os包的使用
May 09 #Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 #Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 #Golang
GoLang中生成UUID唯一标识的实现
May 08 #Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
Golang全局变量加锁的问题解决
You might like
详细介绍PHP应用提速面面观
2006/10/09 PHP
一个PHP日历程序
2006/12/06 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
python去除所有html标签的方法
2015/05/05 Python
python reduce 函数使用详解
2017/12/05 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
党员年终民主评议的自我评价
2013/11/05 职场文书
质检部经理岗位职责
2014/02/19 职场文书
岗位说明书范文
2014/05/07 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
临时租车协议范本
2014/09/23 职场文书
抗洪救灾标语
2014/10/08 职场文书
邀请函怎么写
2015/01/30 职场文书
客房领班岗位职责
2015/02/11 职场文书
八月迷情观后感
2015/06/11 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
python自动化测试之Selenium详解
2022/03/13 Python