Go下MySQL Api学习与入门
前言
本文讲解Go查询MySQL基础操作,入门级教程。包括两大部分
-
环境部署(Docker安装MySQL)。
-
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可能随时被销毁与重建)
验证:
- 验证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
- 连接上数据库,并创建测试数据
# 执行数据库连接操作
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
- 插入操作,向数据库中插入数据代码范例如下:
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()
}
- 查询操作,查询代码语句如下:
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)
}
- 更新操作,插入代码语句如下:
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)
}
- 删除操作,删除代码语句如下:
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…
转载自:https://juejin.cn/post/7147506681188974599