(8)go-micro微服务Mysql配置

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: (8)go-micro微服务Mysql配置

一 gorm介绍

Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。

我们常用的数据库基本上都有完整的第三方实现。例如:MySQL驱动


二 gorm安装

1.1 下载依赖

go get -u github.com/go-sql-driver/mysql

1.2 使用MySQL驱动

func Open(driverName, dataSourceName string) (*DB, error)


三 CURD操作

  • 下面介绍一下gorm的简单用法

1. 查询

为了方便查询,我们事先定义好一个结构体来存储user表的数据。


type user struct {
  id   int
  age  int
  name string
}

1.1 单行查询

单行查询db.QueryRow()执行一次查询,并期望返回最多一行结果(即Row)。QueryRow总是返回非nil的值,直到返回值的Scan方法被调用时,才会返回被延迟的错误。


func (db *DB) QueryRow(query string, args ...interface{}) *Row

具体示例代码:

// 查询单条数据示例
func queryRowDemo() {
  sqlStr := "select id, name, age from user where id=?"
  var u user
  // 确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
  err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age)
  if err != nil {
    fmt.Printf("scan failed, err:%v\n", err)
    return
  }
  fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)

1.2 多行查询

多行查询db.Query()执行一次查询,返回多行结果(即Rows),一般用于执行select命令。参数args表示query中的占位参数。


func (db *DB) Query(query string, args ...interface{}) (*Rows, error)

具体示例代码:

// 查询多条数据示例
func queryMultiRowDemo() {
  sqlStr := "select id, name, age from user where id > ?"
  rows, err := db.Query(sqlStr, 0)
  if err != nil {
    fmt.Printf("query failed, err:%v\n", err)
    return
  }
  // 关闭rows释放持有的数据库链接
  defer rows.Close()
  // 循环读取结果集中的数据
  for rows.Next() {
    var u user
    err := rows.Scan(&u.id, &u.name, &u.age)
    if err != nil {
      fmt.Printf("scan failed, err:%v\n", err)
      return
    }
    fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
  }
}

2. 插入数据

插入、更新和删除操作都使用Exec方法。

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

Exec执行一次命令(包括查询、删除、更新、插入等),返回的Result是对已执行的SQL命令的总结。参数args表示query中的占位参数。

具体插入数据示例代码如下:

// 插入数据
func insertRowDemo() {
  sqlStr := "insert into user(name, age) values (?,?)"
  ret, err := db.Exec(sqlStr, "王五", 38)
  if err != nil {
    fmt.Printf("insert failed, err:%v\n", err)
    return
  }
  theID, err := ret.LastInsertId() // 新插入数据的id
  if err != nil {
    fmt.Printf("get lastinsert ID failed, err:%v\n", err)
    return
  }
  fmt.Printf("insert success, the id is %d.\n", theID)
}

3. 更新数据

具体更新数据示例代码如下:

// 更新数据
func updateRowDemo() {
  sqlStr := "update user set age=? where id = ?"
  ret, err := db.Exec(sqlStr, 39, 3)
  if err != nil {
    fmt.Printf("update failed, err:%v\n", err)
    return
  }
  n, err := ret.RowsAffected() // 操作影响的行数
  if err != nil {
    fmt.Printf("get RowsAffected failed, err:%v\n", err)
    return
  }
  fmt.Printf("update success, affected rows:%d\n", n)
}

4. 删除数据

具体删除数据的示例代码如下:

// 删除数据
func deleteRowDemo() {
  sqlStr := "delete from user where id = ?"
  ret, err := db.Exec(sqlStr, 3)
  if err != nil {
    fmt.Printf("delete failed, err:%v\n", err)
    return
  }
  n, err := ret.RowsAffected() // 操作影响的行数
  if err != nil {
    fmt.Printf("get RowsAffected failed, err:%v\n", err)
    return
  }
  fmt.Printf("delete success, affected rows:%d\n", n)
}

四 初始化连接

  • 在mysql目录下新建mysql.go文件
  • 写入以下代码:


package mysql
import (
   "github.com/jinzhu/gorm"
)
// MysqlInit 初始化数据库
func MysqlInit(user string,pwd string,database string)(*gorm.DB,error){
   //连接数据库
   db, err := gorm.Open("mysql", user+":"+pwd+"@/"+database+"?charset=utf8&parseTime=True&loc=Local")
   if err != nil {
      return db,err
   }
   //禁止复表
   db.SingularTable(true)
   //初始化表,只使用第一次
   //err = repository.NewUserRepository(db).InitTable()
   //if err != nil {
   // logger.Error(err)
   //}
   return db,nil
}

五 使用

在main.go文件中编写代码 初始化数据库:

db, err := mysql.MysqlInit(micro.ConsulInfo.Mysql.User, micro.ConsulInfo.Mysql.Pwd, micro.ConsulInfo.Mysql.Database)
if err != nil {
   logger.Error(err)
   return
}
defer db.Close()

六 最后

  • 至此,go-micro微服务Mysql配置开发工作就正式完成。
  • 接下来就开始正式的Redis配置编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Go API Docker
热门go与微服务15
热门go与微服务15
31 2
|
1月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
1月前
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
1月前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)
|
1天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
2天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
6天前
|
负载均衡 Go API
探索Go语言在微服务架构中的应用与优势
在这篇技术性文章中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构时的独特优势。文章将通过对比分析Go语言与其他主流编程语言,展示Go在并发处理、性能优化、以及开发效率上的优势。同时,我们将通过一个实际的微服务案例,详细说明如何利用Go语言构建高效、可扩展的微服务系统。
|
10天前
|
安全 Go 云计算
探索Go语言在微服务架构中的应用与优势
在本文中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构中的独特优势。文章将分析Go语言的并发模型、简洁的语法以及高效的编译速度,以及这些特性如何使其成为微服务架构的理想选择。我们将通过一个简单的微服务示例,展示Go语言在实际开发中的表现,并讨论其在性能和可维护性方面的优势。
|
29天前
|
关系型数据库 MySQL Go
go抽取mysql配置到yaml配置文件
go抽取mysql配置到yaml配置文件
|
7天前
|
消息中间件 监控 Go
Go语言在微服务架构中的优势与实践
【10月更文挑战第10天】Go语言在微服务架构中的优势与实践