21

golang 使用xorm操作mysql

 4 years ago
source link: https://studygolang.com/articles/27223
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

xorm

官方介绍:xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。

xorm还提供了工具,通过reverse命令根据数据库的表结构生成对应的struct,省去了人工组织代码的工作,十分方便。

官方地址: https://xorm.io/

中文文档: https://books.studygolang.com...

安装

浏览xorm的github地址,我们要下载2个包, https://github.com/go-xorm

FvMVVr6.png!web

1、xorm驱动包,我们使用xorm的核心包

2、cmd工具包,用于使用reverse命令生成数据表对应的struct

通过go get命令分别下载2个包

go get github.com/go-xorm/xorm
go get github.com/go-xorm/cmd

下载完成后github.com文件夹下会出现go-xorm包

3Qn6Vzj.png!web

生成数据结构struct

本地数据库test有2张数据表,doctor_tb和user_tb,数据结构如下:

jUzeaa7.png!web

qaamuiV.png!web

我们现在就来生成这2张数据表的结构模型。

1、在任意项目下新建一个文件夹xorm_models,文件名没有规定,为了存放生成的代码文件。

2、拷贝cmd工具包中的摸板目录到xorm_models下,在文件目录 github.com\go-xorm\cmd\xorm\templates\goxorm

iQRrEnM.png!web

config是生成的配置信息,struct.go.tpl是数据摸板,允许自定义,可以根据自己的项目需求,修改摸板。一般不需要修改。

BrMbUrv.png!web

3、打开cmd命令行窗口,进入xorm_models目录下,执行reverse命令:xorm reverse [数据库类型] [数据库连接串] [模板目录]

xorm reverse mysql root:112233@tcp(127.0.0.1:3305)/test?charset=utf8 templates/goxorm

7j6vuiv.png!web

4、数据结构代码会自动生成在xorm_models/models目录下.

AvyQ3iQ.png!web

我们能看到生成了和表名同名的2个数据结构文件doctor_tb.go和user_tb.go

package models
import (
    "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 main

import (
    "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里提供了我们开发业务上常用的增,删,改,查单条数据,查列表,查分页,事务等内容。

如果文章对你有用,请点个赞。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK