likes
comments
collection
share

Go下MySQL Api学习与入门

作者站长头像
站长
· 阅读数 8

前言

本文讲解Go查询MySQL基础操作,入门级教程。包括两大部分

  1. 环境部署(Docker安装MySQL)。

  2. Go对数据库CRUD操作。

下面文档是Go MySQL驱动文档,可以从下面文章中找到相关API,对数据库执行响应操作。 github.com/go-sql-driv…

环境部署

说明:

这里使用的部署方式是docker部署Mysql。

原因:本地开发方便随时开启关闭,并且可以保持环境干净。MySql服务也不需要一直开着,不用的时候关闭可以节省机器资源。

注意: 如果部署线上就不要用dokcer,性能差的还是太多(如果线上选用云厂商,就不需考虑部署问题。)

部署:

部署MySql, Docker下部署MySQL容器命令是:

docker run -p 3306:3306 --name mysql -v /your_path/data/mysql/conf:/etc/mysql/conf.d -v /your_path/data/mysql/data:/var/lib/mysql -v /your_path/data/mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=your_password -d mysql

命令简述:

-p: 端口映射, 映射格式为 host port: container port

-name: container name 。容器名称

-v: 本地磁盘与容器磁盘关联。 Local path: Container path

-e: 环境变量

-d: 服务运行在后台,而不是当前宿主机下

通过上面的命令,就可以创建一个本地MySql服务。服务账号 root, 密码是:your_password

思考: 如何修改mysql.ini 配置。(不是进入到Container中修改,Container可能随时被销毁与重建)

验证:

  1. 验证MySql容器启动成功
# 查看docker下容器
docker ps

# 结果见下图。 主要是下图中的STATUS字段,表示状态成功
#CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
#46f634166f0e   mysql     "docker-entrypoint.s…"   36 seconds ago   Up 35 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql


  1. 连接上数据库,并创建测试数据
# 执行数据库连接操作
 docker exec  -it mysql mysql -uroot -pyour_password -P3306
 
# 连接上数据库后创建测试数据
create database test;
use test;

CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `age` INT UNSIGNED NOT NULL,
   `name` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

到这里,我们就完成了,数据库创建。

小结:

到此为止,我们已经完成MySql服务。 万事开头难,很多同学都觉得服务难以配置,而一直迟迟不能开始。 这里我们用了最简单的办法创建服务,希望降低门槛。

API学习

Go-MySQL-Driver 是一个 实现了Go中 data/base/dirver 库定义的接口包。

首先使用 gool tool 命令安装package到 $GOPATH中。

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

说明:如果提示下载包失败。可以修改Go代理进行下载。可以执行下面操作:

# 此操作仅仅是一次性修改
export GOPROXY=https://goproxy.cn

# 查看Go代理环境
go env PROXY

#最后再去执行下载操作
go get -u github.com/go-sql-driver/mysql

  1. 插入操作,向数据库中插入数据代码范例如下:
package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql" //匿名导入包 —— 只导入包但不使用包内类型和数值。匿名包和其他包一样会让导入包编译到可执行文件中,同时导入包也会触发 init()函数调用
   "strings"
   "time"
)

//我们先将数据库配置信息定义成为常量
const (
   userName = "root"
   password = "your_password"
   ip       = "127.0.0.1"
   port     = "3306"
   dbName   = "test"
)

//初始化数据库连接,返回数据库连接的指针引用
func InitDB() *sql.DB {
   //Golang数据连接:"用户名:密码@tcp(IP:端口号)/数据库名?charset=utf8"
   path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
   //打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
   // a hander for a database. 它并没有真正的去打开一个链接。因此也并不会报错
   db, _ := sql.Open("mysql", path)
   //defer db.Close()  在适当的时候要对数据库进行关闭
   //the maximum amount of time a connection may be reused. 简单理解就是多长时间不用会回收此链接
   //官方推荐时间 小于 5 minutes
   db.SetConnMaxLifetime(time.Minute * 3)
   //设置数据库的最大链接个数, 强力推荐根据server情况进行设置。但是没有默认的推荐值
   db.SetMaxOpenConns(5)
   //设置上数据库最大闲置连接数。建议和 MaxOpenConns相同,这样可以避免数据库频繁打开和关闭
   db.SetMaxIdleConns(5)
   //Ping verifies a connection to the database is still alive, establishing a connection if necessary.
   //用来验证链接是否还存活,必要的话会建立一个链接。
   if err := db.Ping(); err != nil {
      fmt.Println("连接失败~~1")
      panic(err)
   }
   //将数据库连接的指针引用返回
   return db
}

func main() {
   //使用工具获取数据库连接
   db := InitDB()
   //开启事务 [这里不使用事务也是可以的]
   tx, err := db.Begin()
   if err != nil {
      //事务开启失败,直接panic
      panic(err)
   }
   //准备SQL语句 ? = placeholder
   sql := "insert into user (`name`, `age`) values (?, ?)"
   //对SQL语句进行预处理
   stmt, err := db.Prepare(sql)
   if err != nil {
      panic(err)
   }
   defer stmt.Close() // Close the statement when we leave main() / the program terminates

   //Execute stmt
   result, err := stmt.Exec("Rock", 30)
   if err != nil {
      //SQL执行失败,直接panic
      panic(err)
   }
   //返回插入记录的id
   fmt.Println(result.LastInsertId())
   //提交事务
   tx.Commit()
}
  1. 查询操作,查询代码语句如下:
func main() {
   db := InitDB()
   sql := "SELECT name FROM user WHERE id = ?"

   stmt, err := db.Prepare(sql)
   if err != nil {
      panic(err)
   }
   defer stmt.Close()
   var ret string
   //执行查询语句, QueryRow 用来赋值查询语句。Scan取出结果
   err = stmt.QueryRow(1).Scan(&ret)
   if err != nil {
      panic(err)
   }
   fmt.Println(ret)
}
  1. 更新操作,插入代码语句如下:
func main() {
   db := InitDB()
   sql := "UPDATE user SET name=?  WHERE id = ?"

   stmt, err := db.Prepare(sql)
   if err != nil {
      panic(err)
   }
   defer stmt.Close()
   var ret string
   //执行查询语句, QueryRow 用来赋值查询语句。Scan取出结果
   _, error := stmt.Exec("张三", 1)
   if error != nil {
      panic(error)
   }
   fmt.Println(ret)
}
  1. 删除操作,删除代码语句如下:
func main() {
   db := InitDB()
   sql := "Delete from user  WHERE id = ?;"

   stmt, err := db.Prepare(sql)
   if err != nil {
      panic(err)
   }
   defer stmt.Close()
   var ret string
   //执行查询语句, QueryRow 用来赋值查询语句。Scan取出结果
   _, error := stmt.Exec(1)
   if error != nil {
      panic(error)
   }
   fmt.Println(ret)
}

总结

本文主要帮助新人入门而写,包括基础环境部署,以及CRUD操作语句。

代码上传地址: github.com/CodingStone…