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 相关文章推荐
golang 生成对应的数据表struct定义操作
Apr 28 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go 语言结构实例分析
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
GO中sync包自由控制并发示例详解
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+Html+缓存
2006/11/25 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
JS判断两个时间大小的示例代码
2014/01/28 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
实战node静态文件服务器的示例代码
2018/03/08 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
Python微医挂号网医生数据抓取
2019/01/24 Python
python Tkinter的图片刷新实例
2019/06/14 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
python3处理word文档实例分析
2020/12/01 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
婚礼主持词开场白
2014/03/13 职场文书
文化活动实施方案
2014/03/28 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
世界环境日活动总结
2015/02/11 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
党委工作总结2015
2015/04/27 职场文书
被告答辩状范文
2015/05/22 职场文书
房屋产权证明书
2015/06/19 职场文书
高三化学教学反思
2016/02/22 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android