golang 使用xorm操作mysql

栏目: IT技术 · 发布时间: 4年前

内容简介:xorm还提供了工具,通过reverse命令根据数据库的表结构生成对应的struct,省去了人工组织代码的工作,十分方便。官方地址:中文文档:

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

golang 使用xorm操作mysql

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包

golang 使用xorm操作mysql

生成数据结构struct

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

golang 使用xorm操作mysql

golang 使用xorm操作mysql

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

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

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

golang 使用xorm操作mysql

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

golang 使用xorm操作mysql

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

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

golang 使用xorm操作mysql

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

golang 使用xorm操作mysql

我们能看到生成了和表名同名的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里提供了我们开发业务上常用的增,删,改,查单条数据,查列表,查分页,事务等内容。

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Reality Is Broken

Reality Is Broken

Jane McGonigal / Penguin Press HC, The / 2011-1-20 / USD 26.95

Visionary game designer Jane McGonigal reveals how we can harness the power of games to solve real-world problems and boost global happiness. More than 174 million Americans are gamers, and......一起来看看 《Reality Is Broken》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具