返回顶部
首页 > 资讯 > 数据库 >详解Go语言如何使用xorm实现读取mysql
  • 534
分享到

详解Go语言如何使用xorm实现读取mysql

Go语言 xorm读取mysqlGo语言 读取mysqlGo语言 xorm mysql 2022-11-19 06:11:32 534人浏览 安东尼
摘要

目录一、介绍二、安装使用xORM,注意连接的关闭!关于连接数的坑以及engine.Close()常用方法介绍三、Mysql生产struct四、xorm常用操作示例--insert数据4.1 insert 增加1条数据4.

一、介绍

xorm是Go语言的常用orm之一,用来操作数据库

主要特性特性:

  • 支持根据数据库自动生成xorm的结构体
  • 支持Struct和数据库表之间的灵活映射, 并支持自动同步
  • 支持事务
  • 支持使用Id, In, Where, Limit, Join, Having, Table, sql, Cols等函数和结构体等方式作为条件
  • 支持查询结果集导出csv、tsv、XML、JSON、xlsx、yaml、html功能

二、安装使用xorm,注意连接的关闭!

import (
    _ "GitHub.com/go-sql-driver/mysql"
    "xorm.io/xorm"
)

然后我们就可以构造一个new方法来初始化使用 orm客户端了。

我们在下面的代码,会通过一个函数返回 xorm.EngineInterface,以及一个 engine.Close()函数供使用者调用,之所以这样是因为,有些比如脚本脚本之类的
当执行完,就需要把 mysql连接关闭掉,以用来节省连接数。

如果都不关闭的话,在高并发的情况下,连接数很多,会把mysql打爆!

type MysqlClient xorm.EngineInterface
func NewMysqlClient() (MysqlClient, func(), error) {
    // 创建 engine 对象
    engine, err := xorm.NewEngine("mysql", "user:pwd@tcp(ip:port)/dbname?charset=utf8")
    if err != nil {
        fmt.Printf("init engine fail! err:%+v", err)
    }
    // 连接池配置
    engine.SetMaxOpenConns(30)                  // 最大 db 连接
    engine.SetMaxIdleConns(10)                  // 最大 db 连接空闲数
    engine.SetConnMaxLifetime(30 * time.Minute) // 超过空闲数连接存活时间

    // 日志相关配置
    engine.ShowSQL(true)                    // 打印日志
    engine.Logger().SetLevel(log.LOG_DEBUG) // 打印日志级别
    engine.SetLogger(log.SimpleLogger{})    // 设置日志输出 (控制台, 日志文件, 系统日志等)

    // 测试连通性
    if err = engine.Ping(); err != nil {
        fmt.Printf("ping to db fail! err:%+v", err)
    }
    return engine, func() {
        engine.Close()
    }, err
}

关于连接数的坑以及engine.Close()

engine可以通过engine.Close来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。

但是如果,每个连接都是新建了一个 client的话,一般Http服务不会退出,如果此时高并发,就会增加无数的mysql连接数,打爆mysql。

在这个NewMysqlClient函数里我们创建了一个 全局的变量 MysqlClient,全局共用一个连接。

常用方法介绍

engine.SetMaxOpenConns(30) 创建连接池

engine.ShowSQL(true) 在控制台打印sql语句

engine.Logger().SetLevel(log.LOG_DEBUG) 在控制台打印调试及以上的信息

engine.SetLogger(log.DiscardLogger{}) 把日志写入到文件,或者专门的日志收集系统里。

三、mysql生产struct

使用官方自带的reverse工具 https://gitea.com/xorm/reverse比如我们现在在有一个表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `status` smallint(6) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

我们使用 reverse -f sql_reverse.yaml 来生成 struct

sql_reverse.yaml的代码如下:

# 步骤1:安装 go get xorm.io/reverse
# 步骤2:修改上面文件中的conn_str以及include_tables的表
# 步骤3:执行reverse -f sql_reverse.yaml

kind: reverse
name: mydb
source:
  database: mysql
  conn_str: 'user:pasWord@tcp(localhost:3306)/test?charset=utf8mb4'
targets:
  - type: codes
    language: golang
    include_tables: # 需要生成的表的结构
      - user //我们要生产的表明
    multiple_files: true
    output_dir: ./internal/domain/flow/repository/po
    template: |
      package po

      {{$ilen := len .Imports}}
      {{if gt $ilen 0}}
      import (
        {{range .Imports}}"{{.}}"{{end}}
      )
      {{end}}

      {{range .Tables}}
      type {{TableMapper .Name}} struct {
      {{$table := .}}
      {{range .ColumnsSeq}}{{$col := $table.GetColumn .}}    {{ColumnMapper $col.Name}}    {{Type $col}} `{{Tag $table $col}}`
      {{end}}
      }

      func (m *{{TableMapper .Name}}) TableName() string {
          return "{{$table.Name}}"
      }
      {{end}}
    template_path: ./template/goxorm.tmpl # template path for code file, it has higher perior than template field on language

生成对应的go代码为

type User struct {
    Id     int64  `json:"id" xorm:"'id' int(11) not null pk autoincr  "`
    Name   string `json:"name" xorm:"'name' varchar(45) null   "`
    Status int64  `json:"status" xorm:"'status' smallint(3) null   "`
}

func (m *User) TableName() string {
    return "user"
}

四、xorm常用操作示例--insert数据

4.1 insert 增加1条数据

增加一条对象。

engine, _, _ := NewMysqlClient()
    u := User{
        Name:   "hisheng",
        Status: 0,
    }
    affected, err := engine.Insert(&u)
    t.Log(affected, err)

4.2 insert 增加多条数据

多条数据,还是Insert方法,参数为slice就行。

func TestInsertUsers(t *testing.T) {
    engine, _, _ := NewMysqlClient()
    us := []User{{Name: "hi", Status: 1}, {Name: "sheng", Status: 1}}
    affected, err := engine.Insert(&us)
    t.Log(affected, err)
}

当插入多条数据的时候,官方建议我们少于150条数据,多余150条数据的时候,容易插入失败。

4.3 insert 增加不同表数据

user := new(User)
user.Name = "myname"
...
questions := make([]Question, 1)
questions[0].Content = "whywhywhwy?"
affected, err := engine.Insert(user, &questions)

五、xorm常用操作示例--删除某行

5.1 通过id删除

user := new(User)
affected, err := engine.ID(id).Delete(user)

5.2 通过where条件删除

user := new(User)
affected, err := engine.Where("id = ?",1).Delete(user)

5.3 软删除,通过某个字段实现软删除,比如status=0

这个用更新的方法

u := User{
        Status: 0,
    }
    affected, err := engine.Where("id = ?",1).MustCols("status").Update(&u)
    t.Log(affected, err)

注意这里,增加了一个MustCols,因为xorm默认是有值自动更新的,而status和默认值,是一样的,默认值会被忽略而不被更新,此时要更新,需要加一个 MustCols字段。

六、xorm常用操作示例--update更新操作

6.1 以结构体的参数,传递要更新的字段

func TestUpdate(t *testing.T) {
    engine, _, _ := NewMysqlClient()
    u := User{
        Name: "1111",
    }
    affected, err := engine.ID(1).Update(&u)
}

这个会Update的参数是更新字段。这里会更新Name字段。

6.2 以map做为参数,传递要更新的字段

以map作为要更新的字段,传递方式,map的格式为 map[string]interface{}

func TestUpdateMap(t *testing.T) {
    engine, _, _ := NewMysqlClient()
    u := map[string]interface{}{"name": "111"}
    affected, err := engine.ID(1).Update(u)
}

6.3指定字段更新,未指定的将不更新,指定了的即使为0也会更新。

我们通过添加Cols函数指定需要更新结构体中的值。

affected, err := engine.ID(id).Cols("age").Update(&user)

6.4指定字段更新,未指定的根据值是否是有值来更新。

有时候希望能够指定必须更新某些字段,而其它字段根据值的情况自动判断,可以使用 MustCols 来组合 Update 使用。

affected, err := engine.ID(id).MustCols("age").Update(&user)

七、xorm常用操作示例--查询单条

查询单条数据使用Get方法,在调用Get方法时需要传入一个对应结构体的指针,同时结构体中的非空field自动成为查询的条件和前面的方法条件组合在一起查询。

7.1 根据主键Id来获得单条数据:

user := new(User)
has, err := engine.ID(id).Get(user)

7.2 根据where来获得单条数据:

user := new(User)
has, err := engine.Where("name=?", "xlw").Get(user)

7.3 根据user机构体中非空数据来获得单条数据:

user := &User{Id:1}
has, err := engine.Get(user)

八、xorm常用操作示例--查询多条数据

查询多条数据使用Find方法,Find方法的第一个参数为slice的指针或Map指针,即为查询后返回的结果,第二个参数可选,为查询的条件struct的指针。

8.1 返回结果为 结构体slice:

everyone := make([]User, 0)
err := engine.Find(&everyone)

8.2 返回结果为 结构体map:

users := make(map[int64]User)
err := engine.Find(&users)

九、xorm常用操作示例--FindAndCount 分页

FindAndCount 返回结果为 结构体slice 以及总数:

everyone := make([]User, 0)
count,err := engine.Limit(1,20).FindAndCount(&everyone)

十、xorm常用操作示例--事务操作

func TestTransaction(t *testing.T) {
    engine, _, _ := NewMysqlClient()
    session := engine.NewSession()
    defer session.Close()
    if err := session.Begin(); err != nil {
        fmt.Println(err)
        return
    }
    if _, err := session.Insert(&User{Name: "11", Status: 0}); err != nil {
        fmt.Println(err)
        _ = session.Rollback()
        return
    }
    _ = session.Commit()
}

以上就是详解Go语言如何使用xorm实现读取mysql的详细内容,更多关于Go语言 xorm读取mysql的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 详解Go语言如何使用xorm实现读取mysql

本文链接: https://lsjlt.com/news/173114.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Go语言如何使用xorm实现读取mysql
    目录一、介绍二、安装使用xorm,注意连接的关闭!关于连接数的坑以及engine.Close()常用方法介绍三、mysql生产struct四、xorm常用操作示例--insert数据4.1 insert 增加1条数据4....
    99+
    2022-11-19
    Go语言 xorm读取mysql Go语言 读取mysql Go语言 xorm mysql
  • Go语言如何实现读取文件
    这篇文章主要介绍“Go语言如何实现读取文件”,在日常操作中,相信很多人在Go语言如何实现读取文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言如何实现读取文件”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-05
  • Go中如何使用xorm操作mysql
    本文小编为大家详细介绍“Go中如何使用xorm操作mysql”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go中如何使用xorm操作mysql”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。xorm官方介绍:xo...
    99+
    2023-06-26
  • Go语言使用buffer读取文件的实现示例
    目录使用 bufio 包写入文件使用 bufio 包读取文件buffer 是缓冲器的意思,Go语言要实现缓冲读取需要使用到 bufio 包。bufio 包本身包装了 io.Reade...
    99+
    2023-05-14
    Go buffer读取文件 Go buffer读取
  • Go语言如何读取txt文档
    这篇文章将为大家详细讲解有关Go语言如何读取txt文档,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文档内容每行是一个文件名信息,含有空格区分不同项;ioutil.ReadFile返回的是[]bytes切...
    99+
    2023-06-28
  • 如何解读Go语言锁
    这篇文章将为大家详细讲解有关如何解读Go语言锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。var l sync.Mutexvar a stringfunc...
    99+
    2024-04-02
  • 解读Go语言实现的奥秘
    go语言通过gc编译器编译为可执行文件,编译过程包括解析、ssa转换、优化和代码生成。其并发性基于csp模型,通过goroutine、通道和选择机制实现。垃圾收集器使用标记-清除算法回收...
    99+
    2024-04-03
    编程 go语言
  • Go语言怎么使用buffer读取文件
    这篇文章主要讲解了“Go语言怎么使用buffer读取文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言怎么使用buffer读取文件”吧!buffer 是缓冲器的意思,Go语言要实现缓...
    99+
    2023-07-05
  • Go语言如何读取YAML配置文件
    今天小编给大家分享一下Go语言如何读取YAML配置文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。yaml.v3 包yam...
    99+
    2023-07-04
  • C语言实现读取CSV文件的方法详解
    1、每一次只能读取同一种数据类型,不能读取字符串。 2、第次读取会返回一个 CSV数据结构,有源数据和二维数组,行列数信息 3、可以转换二维数组,但总大小不能变 123.csv M...
    99+
    2022-12-21
    C语言读取CSV文件 C语言读取CSV C语言 CSV
  • 详解Go语言如何实现二叉树遍历
    目录1. 二叉树的定义2. 前序遍历3. 中序遍历4. 后序遍历1. 二叉树的定义 二叉树需满足的条件 ① 本身是有序树 ② 树中包含的各个节点的长度不能超过2,即只能是0、1或者2...
    99+
    2024-04-02
  • Go语言实现读取文件的方式总结
    目录前言整个文件读取按行读取逐个单词读取以数据块的形式读取文件二进制读取总结前言 这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。 os 包提供了一个...
    99+
    2023-05-14
    Go语言读取文件方式 Go语言读取文件 Go语言 文件
  • Go 语言中如何使用关键字函数来读取文件?
    Go 语言是一种现代化的编程语言,它被广泛应用于各种领域,如网络编程、云计算、数据科学等。在这篇文章中,我们将介绍如何使用 Go 语言中的关键字函数来读取文件。 在 Go 语言中,读取文件的过程可以分为以下三个步骤: 打开文件:使用 ...
    99+
    2023-10-23
    函数 关键字 文件
  • 如何用 Go 语言实现 SCP
    随着数据传输的不断增长,传输大量数据时如何确保数据安全和传输效率变得越来越重要。SCP (Secure Copy Protocol)是一种安全传输文件的协议,与SSH (Secure Shell)一起使用。本文将介绍如何用 Go 语言实现 ...
    99+
    2023-05-14
  • 如何使用MySQL和Go语言实现用户注册功能
    如何使用MySQL和Go语言实现用户注册功能开发一个具有用户注册功能的网站或应用程序,是很常见的需求。本文将介绍如何使用MySQL数据库和Go语言来实现用户注册功能,包括数据库的设计和操作、Go语言的路由和处理函数、表单验证、密码加密等内容...
    99+
    2023-10-22
    MySQL Go语言 用户注册
  • 如何在Go语言中读取和解析索引文件?
    Go语言是一种开源的静态编译型编程语言,由Google公司开发,目前已经成为众多开发者的首选语言。在Go语言中,索引文件是一种常见的数据结构,它可以帮助我们快速地定位到所需要的信息。在本文中,我们将介绍如何在Go语言中读取和解析索引文件,以...
    99+
    2023-08-15
    二维码 unix 索引
  • Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据 在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如...
    99+
    2024-04-02
  • 解读C语言中Go语句的实现原理
    《C语言中Go语句的实现原理解析》 Go语句是Go语言中的一个关键字,用于实现并发执行任务。在C语言中,我们可以通过使用线程和多线程库来实现类似于Go语句的功能。本文将介绍C语言中如何...
    99+
    2024-04-02
  • Go语言中sync.Cond使用详解
    目录sync.Cond 可以用来干什么? 与 Sync.Mutex 的区别 sync.Cond 使用场景 sync.Cond sync.Cond 有哪些方法 NewCond 创建实例...
    99+
    2024-04-02
  • C语言如何使用getch()读取方向键
    本篇内容主要讲解“C语言如何使用getch()读取方向键”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何使用getch()读取方向键”吧!初衷:在解决N皇后问题时需要使用方向键实现布局切...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作