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如何替换某个文件中的字符串
Apr 25 Golang
golang json数组拼接的实例
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go语言编译原理之源码调试
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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP count()函数讲解
2019/02/03 PHP
php创建类并调用的实例方法
2019/09/25 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
小型js框架veryide.librar源代码
2009/03/05 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python在非root权限下的安装方法
2018/01/23 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
Python request使用方法及问题总结
2020/04/26 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
生日邀请函范文
2014/01/13 职场文书
解除劳动合同协议书
2014/04/14 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
社团个人总结范文
2015/03/05 职场文书
小学校本教研总结
2015/08/13 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
用php如何解决大文件分片上传问题
2021/07/07 PHP
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
python实现会员管理系统
2022/03/18 Python