golang orm库xorm的使用和项目结构

本文介绍了 golang orm 库 xorm 的使用和项目结构。
xorm 官方介绍:xorm 是一个简单而强大的 go 语言 orm 库。通过它可以使数据库操作非常简便。xorm 的目标并不是让你完全不去学习 sql,我们认为 sql 并不会为 orm 所替代,但是 orm 将可以解决绝大部分的简单 sql 需求。xorm 支持两种风格的混用。 xorm 还提供了工具,通过 reverse 命令根据数据库的表结构生成对应的 struct,省去了人工组织代码的工作,十分方便。官方地址:https://xorm.io/
安装 浏览 xorm 的 github 地址,我们要下载 2 个包,https://github.com/go-xorm
1、xorm 驱动包,我们使用 xorm 的核心包 2、cmd 工具包,用于使用 reverse 命令生成数据表对应的 struct
通过 go get 命令分别下载 2 个包go get github.com/go-xorm/xormgo get github.com/go-xorm/cmd/xorm下载完成后 github.com 文件夹下会出现 go-xorm 包
生成数据结构 struct 本地数据库 test 有 2 张数据表,doctor_tb 和 user_tb, 数据结构如下:
我们现在就来生成这 2 张数据表的结构模型。
1、在任意项目下新建一个文件夹 xorm_models,文件名没有规定,为了存放生成的代码文件。 2、拷贝 cmd 工具包中的摸板目录到 xorm_models 下,在文件目录github.comgo-xormcmdxorm emplatesgoxorm下
config 是生成的配置信息,struct.go.tpl 是数据摸板,允许自定义,可以根据自己的项目需求,修改摸板。一般不需要修改。
3、打开 cmd 命令行窗口,进入 xorm_models 目录下,执行 reverse 命令:xorm reverse [数据库类型] [数据库连接串] [模板目录] xorm reverse mysql root:112233@tcp(127.0.0.1:3305)/test?charset=utf8 templates/goxorm
4、数据结构代码会自动生成在 xorm_models/models 目录下。
我们能看到生成了和表名同名的 2 个数据结构文件 doctor_tb.go 和 user_tb.go
package modelsimport (    time)type doctortb struct {    id      int       `xorm:not null pk autoincr int(11)`    name    string    `xorm:default '' comment('姓名') varchar(50)`    age     int       `xorm:default 0 comment('年龄') int(11)`    sex     int       `xorm:default 0 comment('性别') int(11)`    addtime time.time `xorm:datetime`} 使用 xorm xorm 支持链式的写法engine.where(age > ?, 40).or(name like ?, 林%).orderby(id desc).find(&doclist2)也支持直接执行 sql 语句engine.sql(select * from doctor_tb where age > ?, 40).find(&doclist4)
附上增删改查事务的 demo 例子,代码里都有注释,很容易看懂。xorm 的封装比较友好,只要熟悉 sql 语句,即便不看文档,也能顺利的使用各种关键字。
package mainimport (    fmt    _ github.com/go-sql-driver/mysql    github.com/go-xorm/xorm    goshare/xorm_models/models    time)func main() {    var engine *xorm.engine    //连接数据库    engine, err := xorm.newengine(mysql, root:112233@tcp(127.0.0.1:3305)/test?charset=utf8)    if err != nil {        fmt.println(err)        return    }    //连接测试    if err := engine.ping(); err != nil {        fmt.println(err)        return    }    defer engine.close() //延迟关闭数据库    fmt.println(数据库链接成功)    //查询单条数据    var doc models.doctortb    b, _ := engine.where(name = ?, 钟南山).get(&doc)    if b {        fmt.println(doc)    } else {        fmt.println(数据不存在)    }    //查询单条数据方式 2 会根据结构体的    doc2 := models.doctortb{name: 钟南山}    b, _ = engine.get(&doc2)    fmt.println(doc2)    //新增数据    doc3 := models.doctortb{0, 王医生, 48, 1, time.now()}    i3, _ := engine.insertone(doc3)    fmt.println(新增结果:, i3)    //查询列表    doclist := make([]models.doctortb, 0)    engine.where(age > ? or name like ?, 40, 林%).find(&doclist)    fmt.println(doclist:, doclist)    //查询列表方式 2    doclist2 := make([]models.doctortb, 0)    engine.where(age > ?, 40).or(name like ?, 林%).orderby(id desc).find(&doclist2)    fmt.println(doclist2:, doclist2)    //查询分页    doclist3 := make([]models.doctortb, 0)    page := 0     //页索引    pagesize := 2 //每页数据    limit := pagesize    start := page * pagesize    totalcount, err := engine.where(age > ? or name like ?, 40, 林%).limit(limit, start).findandcount(&doclist3)    fmt.println(总记录数:, totalcount, doclist3:, doclist3)    //直接用语句查询    doclist4 := make([]models.doctortb, 0)    engine.sql(select * from doctor_tb where age > ?, 40).find(&doclist4)    fmt.println(doclist4:, doclist4)    //删除    docdel := models.doctortb{name: 王医生}    idel, _ := engine.delete(&docdel)    fmt.println(删除结果:, idel)    //删除方式 2    engine.exec(delete from doctor_tb where id = ?, 3)    //更新数据    doc5 := models.doctortb{name: 钟医生}    //更新数据 id 为 2 的记录名字更改为“钟医生”    iupdate, _ := engine.id(2).update(&doc5)    fmt.println(更新结果:, iupdate)    //指定表名查询。table()    user := models.usertb{id: 2}    b, _ = engine.table(user_tb).get(&user)    fmt.println(user)    //事务    session := engine.newsession()    defer session.close()    err = session.begin()    _, err = session.exec(delete from doctor_tb where id = ?, 6)    if err != nil {        session.rollback()        return    }    _, err = session.exec(delete from user_tb where id = ?, 10)    if err != nil {        session.rollback()        return    }    err = session.commit()    if err != nil {        return    }    fmt.println(事务执行成功)} 总结 归纳下使用流程 1、下载 xorm 包和 cmd 工具包 2、复制 cmd 工具包里的模板代码文件夹至生成目录底下 3、使用 reverse 生成数据结构代码,省去苦力活 4、实例引擎xorm.newengine()5、痛快的调用
demo 里提供了我们开发业务上常用的增,删,改,查单条数据,查列表,查分页,事务等内容。如果文章对你有用,请点个赞。
转自:segmentfault.com/a/1190000022023758

2019中国国际智能产业博览会将在重庆举行
一总投资约55亿元的COF项目奋力推进建设
电动执行器的结构原理和常见故障分析
Leader打造专业级运动空调:运动时空调放心吹
这款造型奇特,与众不同的哈弗M6将于本月正式上市
golang orm库xorm的使用和项目结构
食品药品检测仪器的检测项目有哪些
英伟达官黄仁勋有望成为半导体行业最具话语权的人
科学家研制出在人体内运送药物的微型机器人
在太阳穴上测量体温的红外传感智能温度计
超六类网线高性能网速的“守护者”
高纵横比MEMS制造技术的4种方法
人工智能领域的发展迎来新一波高潮,人工智能与实体经济快速融合势在必行
深度:智能汽车-嵌入式系统的软件架构设计!
关于透雾技术的分析的介绍
美国证券交易委员会SEC将在2020年对数字资产进行检查
VSS/虚拟演播室系统,如何构建iSCSI磁盘阵列
常见的激光雷达SLAM算法有哪些?
ADI推出战术级10自由度MEMS IMU-ADIS16488
3D打印机OEM厂商WAS推出全新生产型FDM系统