Go--连接mysql,增删改查
下载驱动库,下为官方推荐的,还有其他ORM库,暂时没涉及,故本文不做阐述
go get -u github.com/go-sql-driver/mysql
一、连接
1.1 直接连接,查询单行
package main import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
) func OneLineQuery() {
//拼接mysql数据库信息
dataSourceName := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8&parseTime=True"
//连接mysql
conn, err := sql.Open("mysql", dataSourceName)
if err != nil {
fmt.Println("Failed to connect to database", err)
return
}
//记得结束后关闭连接
defer conn.Close() //单行查询,不管语句查询多少数据,只返回第一行数据
row := conn.QueryRow("select psa_id,name from table_name;")
//提取数据
var psaId int //根据表结构定义变量类型,建议与列名一致
var name string
err = row.Scan(&psaId, &name) //根据查询条件与表结构,修改对应的列名,顺序要一一对应
if err != nil {
fmt.Println("Failure to interpolate data", err)
}
fmt.Println(psaId, name) //输出查询数据
} func main() {
OneLineQuery()
}
1.2 使用连接池
1.2.1 连接池
通过内存中维护一组数据库连接,以便在需要时快速分配和释放连接。
连接池可以有效地管理和复用数据库连接,避免频繁的打开和关闭数据库连接,提高性能并减少资源浪费,故它是以长链接的形式存在内存中。
1.2.2 创建调用
用sql.Open函数创建连接池,可是此时只是初始化了连接池,并没有创建任何连接。连接创建都是惰性的,只有当你真正使用到连接的时候,连接池才会创建连接。
函数调用:
- db.Ping() :调用完毕后会马上把连接返回给连接池。通常使用db.Ping()方法初始化,调用了Ping之后,连接池一定会初始化一个数据库连接
- db.Exec() :调用完毕后会马上把连接返回给连接池,但是它返回的Result对象还保留着连接的引用,当后面的代码需要处理结果集的时候连接将会被重用。
- db.Query() :调用完毕后会将连接传递给sql.Rows类型,当然后者迭代完毕或者显示的调用.Clonse()方法后,连接将会被释放回到连接池。
- db.QueryRow():调用完毕后会将连接传递给sql.Row类型,当.Scan()方法调用之后把连接释放回到连接池。
- db.Begin() :调用完毕后将连接传递给sql.Tx类型对象,当.Commit()或.Rollback()方法调用后释放连接。
1.2.3 连接失败
若连接失败,database/sql会自动尝试重连10次,仍然无法重连的情况下会自动从连接池再获取一个或者新建另外一个。
1.2.4 相关配置
先了解下mysql的相关配置
| 字段 | 简述 | 说明 |
| max_connections | 同时处理的最大连接数 | 通常默认是200,如果服务器达到了这个限制,新的连接请求将被拒绝,直到当前连接数小于阈值为此,可根据业务需求、服务性能进行修改 |
| extra_max_connections | 超过最大连接数后最多可接受的连接数 | 指定了服务器可同时处理的最大连接数。如果服务去繁忙,且连接数已达到了max_connections的限制,这个配置允许服务器接收更多的请求,但可能影响性能,非必要不使用 |
| wait_timeout | 非交互式连接(程序之间调用,如一边是tomcat web服务器,一边是数据库服务器)最大空闲时间 | 如果一段时间内,连接没有发送任何请求,则mysql会断开这个连接,通常默认是8小时(28800秒) |
| interactive_timeout | 交互式连接(本地打开mysql的客户端,在黑窗口下进行各种sql操作)最大空闲时间 | 默认也是8小时(28800秒) |
查看及修改
#查询
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout'; #修改,对已经存在的连接不生效,重新建立连接后生效
SET GLOBAL max_connections = 200;
SET GLOBAL wait_timeout=120;
SET GLOBAL interactive_timeout=120; #永久修改
#修改mysql配置文件(通常是my.cnf或my.ini),重启MySQL服务生效
[mysqld]
max_connections = 200
wait_timeout=28800
interactive_timeout=28800
go连接池相关配置:
- SetMaxOpenConns:最大打开连接数,默认为0,不限制,应小于数据库max_connections的值
- SetMaxIdleConns:最大空闲连接数,应小于SetMaxOpenConns的值
- SetConnMaxLifetime:连接的最大生命周期,默认为0不限制。指定了从建立连接开始到连接关闭之间的总时间(活动+空闲时间),应小于数据库本身的连接超时时间
- SetConnMaxIdleTime:连接的最大空闲时间,指定了连接在没有任何数据传输活动时的最长闲置时间。如果超过这个时间,连接将被关闭
示例:
// DB 设置全局变量
var DB *sql.DB // ConnectionPool 连接池配置
func ConnectionPool() {
//拼接mysql数据库信息
dataSourceName := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8&parseTime=True"
//连接mysql
db, err := sql.Open("mysql", dataSourceName)
if err != nil {
fmt.Println("Failed to connect to database", err)
return
}
//连接池配置
db.SetMaxOpenConns(100) //最大打开连接数,0为不限制
db.SetMaxIdleConns(10) //最大闲置连接数
db.SetConnMaxIdleTime(time.Second * 10) //最大空闲时间
//db.SetConnMaxLifetime(time.Minute * 30) //连接超时时间,应小于数据库本身的连接超时时间
//defer db.Close() //后面代码引用,这里暂不关闭
//赋值
DB = db
}
二、增删改查
以下的操作都使用1.2中的DB变量
2.1 查询
单行查询如1.1,下为多行查询
在遍历时一行行的输出查询数据,在函数中引用
func MultilineQuery() {
rows, err := DB.Query("select psa_id,name from table_name limit 5;")
if err != nil {
fmt.Println("Inquiry Failure", err)
}
defer rows.Close()
//遍历查询结果
for rows.Next() {
var psaId int
var name string
err = rows.Scan(&psaId, &name) //将查询结果映射到变量中
if err != nil {
fmt.Println("Scan data mapping failure", err)
}
//输出数据
fmt.Printf("ID: %d, Name: %s\n", psaId, name)
}
//程序调用完毕后关闭连接池
defer DB.Close()
}
先定义一个结构体,将查询结果映射进结构体内,作为函数返回值,这样查询结构可在查询函数外引用
// 定义结构体,结构类型跟查询字段类型一致,注意顺序
type str struct {
psaId int
name string
} func MultilineQuery() []str {
rows, err := DB.Query("select psa_id,name from table_name limit 5;")
if err != nil {
fmt.Println("Inquiry Failure", err)
}
defer rows.Close() var str1 []str //定义结构体切片,作为函数返回值
//遍历查询结果
for rows.Next() {
var str2 str //定义结构体变量
err = rows.Scan(&str2.psaId, &str2.name) //将查询数据映射到变量中,按顺序
if err != nil {
fmt.Println("Scan data mapping failure", err)
}
str1 = append(str1, str2) //将查询数据添加至结构体切片末尾
} //程序调用完毕后关闭连接池
defer DB.Close() //返回值
return str1
} // ExportData 引用str1
func ExportData(str1 []str) {
//遍历
for _, v := range str1 {
//输出数据
fmt.Println(v.psaId, v.name)
fmt.Println(v)
}
} func main() {
//OneLineQuery()
ConnectionPool()
str1 := MultilineQuery()
ExportData(str1)
}
2.2 增删改
插入数据
func InsertData() {
// 插入数据的SQL语句
//与表结构一致,不然可能会报错,自增主键字段可忽略不写,将自动生成
//但clickhouse的自增主键不可忽略,可用"INSERT INTO table_name (id, column2) VALUES (generateUUIDv4(), ?)"表示
sqlStatement := "INSERT INTO table_name (column1, column2) VALUES (?, ?)"
// 创建事务
tx, err := DB.Begin()
if err != nil {
fmt.Println("事务创建失败:", err)
return
}
// 执行插入语句
_, err = tx.Exec(sqlStatement, "value1", "value2") //value输入具体的值
if err != nil {
fmt.Println("插入数据失败:", err)
tx.Rollback() // 回滚事务
return
}
// 提交事务
err = tx.Commit()
if err != nil {
fmt.Println("提交事务失败:", err)
return
}
fmt.Println("数据插入成功!")
}
删除数据
// 执行删除操作
_, err = DB.Exec("DELETE FROM table_name WHERE condition")
if err != nil {
// 处理删除失败的情况
}
更改数据
// 执行更新语句
err = DB.QueryRow("UPDATE table_name SET column1 = ? WHERE id = ?", "new_value", 1).Scan()
if err != nil {
fmt.Println("更新数据失败:", err)
return
}
Go--连接mysql,增删改查的更多相关文章
- JDBC连接mysql增删改查整体代码
第一种比较low:用了statment,没有用preparedstatement.另外,插入时,不灵活,不能调用参数,但是如果直接给函数形参的话就会被SQL注入攻击,所以,最好在sql语句中使用?代表 ...
- java 连接mysql增删改查
1.创建mysql测试表 2.按下图创建3个文件夹与3个类 3.三个类的代码 PersionDao :目录(Data Access Object), 数据访问对象是第一个面向对象的数据库接口 pack ...
- MySQL—增删改查,分组,连表,limit,union,alter,排序,去重
MySQL增删改查 在表格的增删改查中,查的内容是最多的,包括group by ,join,limit,union,alter,排序都是服务于查的 #sql语句数据行操作补充 #增加: #insert ...
- mysql增删改查相关操作
mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- PHP MySql增删改查
mysql_connect()连接数据库 mysql_select_db选择数据库 mysql_fetch_assoc()获取结果集 mysql_query()执行sql语句 实例如下: <?p ...
- mysql增删改查练习
Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create dat ...
- Django学习之mysql增删改查
上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...
- MySQL增删改查的常用语句汇总
MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...
- nodejs+express+mysql 增删改查
之前,一直使用的是nodejs+thinkjs来完成自己所需的项目需求,而对于nodejs中另外一中应用框架express却了解的少之又少,这两天就简单的了解了一下如何使用express来做一些数据库 ...
随机推荐
- Grok AI 是什么?
原文链接:https://openaigptguide.com/grok-ai/ Grok AI是由马斯克推出的一款高级别的人工智能大语言模型,旨在帮助软件开发者以不同的口头语言交流和表达.它是基于多 ...
- 微信小程序直播接入指南
微信小程序直播接入指南 小程序直播组件接入指引 一.简介 小程序直播,是微信提供给小程序开发者的直播组件.通过调用该组件,商家可以在小程序中实现直播功能. 按下面的使用说明接入,在你的小程序中引入直播 ...
- C/C++ 常用加密与解密算法
计算机安全和数据隐私是现代应用程序设计中至关重要的方面.为了确保数据的机密性和完整性,常常需要使用加密和解密算法.C++是一种广泛使用的编程语言,提供了许多加密和解密算法的实现.本文将介绍一些在C++ ...
- 手把手教你用python做一个年会抽奖系统
引言 马上就要举行年会抽奖了,我们都不知道是否有人能够中奖.我觉得无聊的时候可以尝试自己写一个抽奖系统,主要是为了娱乐.现在人工智能这么方便,写一个简单的代码不是一件困难的事情.今天我想和大家一起构建 ...
- vmware虚拟机 linux 本地yum源,网卡配置ens33,防火墙selinux
1.挂载镜像文件,CentOS-7-x86_64-DVD-1804.iso,并且要处于连接状态 #光盘挂载至/mntmount /dev/sr0 /mnt #备份yum源文件cd /etc/yum.r ...
- wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】
引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...
- startx详解
linux下startx命令详解 用途 初始化一个 X 会话. 语法 startx [ -d Display:0 ] [ -t | -w ] [ -x Startup | [ -r Resources ...
- Aware依赖注入管理
1.Aware介绍 在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext.环境属性Environment,BeanFactory等等其他 ...
- shiro基于角色URL进行鉴权
前言 shiro基于URL进行鉴权,网上有很多,但是多数都是copy不排版,眼睛都看花了,还不如自己看看源码. 2021年1月14日21:23:49最新的shiro是1.7,使用时发现了首次访问的一个 ...
- k8s卷管理-1
目录 卷管理-1 1. 本地存储 1.1 emptyDir 1.2 hostPath 网络存储 搭建NFS服务器 使用NFS网络存储 搭建iSCSI服务器 使用iSCSI网络存储 卷管理-1 我们之前 ...