社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

Go 使用xorm操作mysql

马哥Linux运维 • 3 年前 • 410 次点击  

本文介绍了 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.com\go-xorm\cmd\xorm\templates\goxorm下

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 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"王医生"481, 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

文章转载:Go开发大全

(版权归原作者所有,侵删)


点击下方“阅读原文”查看更多

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/121928
 
410 次点击