编程笔记 Golang基础 047 mysql数据库连接与操作
编程笔记 Golang基础 047 mysql数据库连接与操作
- 一、连接与操作
- 1. 安装MySQL驱动
- 2. 导入驱动包
- 3. 连接数据库
- 4. 执行SQL查询和操作
- 5. 使用连接池
- 6. 处理事务
- 二、连接字符串
- 三、应用示例
- 四、比较
MySQL凭借其开源、高效、稳定、灵活、安全以及广泛的社区支持等诸多优势,在全球范围内广受欢迎,尤其是在Web应用程序、云计算和大规模数据处理领域得到了广泛应用。
一、连接与操作
在Go语言中连接和操作MySQL数据库通常涉及以下步骤:
1. 安装MySQL驱动
要使用Go语言连接MySQL,首先需要安装一个兼容的数据库驱动。go-sql-driver/mysql 是一个广泛使用的开源驱动,可以通过 go get 命令来安装:
go get -u github.com/go-sql-driver/mysql
2. 导入驱动包
在Go源代码中,你需要导入 database/sql 包以及 github.com/go-sql-driver/mysql 驱动包:
import ("database/sql"_ "github.com/go-sql-driver/mysql"
)
这里的下划线 _ 表示虽然导入了包,但并不直接引用包内的任何变量或函数。由于MySQL驱动会通过其init函数自动注册到 database/sql 包的驱动列表中,因此只需要在导入时这样写即可。
3. 连接数据库
创建数据库连接实例,通常定义一个全局变量来存放 sql.DB 类型的对象:
import ("fmt""database/sql"_ "github.com/go-sql-driver/mysql"
)func main() {// DSN (Data Source Name) 是包含数据库连接信息的字符串dsn := "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"// 创建数据库连接db, err := sql.Open("mysql", dsn)if err != nil {panic(err.Error())}defer db.Close()// 检查连接是否有效err = db.Ping()if err != nil {panic(err.Error())} else {fmt.Println("Connected to the database!")}
}
DSN应当包含如下信息:
user: 数据库用户名password: 密码tcp(localhost:3306): 服务器地址和端口(这里是本地主机上的默认MySQL端口)/dbname: 要连接的数据库名称charset=utf8mb4: 设置字符集parseTime=True: 让驱动解析时间类型字段为time.Time类型loc=Local: 设置时区为本地时区
4. 执行SQL查询和操作
使用 db 对象执行SQL查询或更新操作:
// 示例:执行查询
rows, err := db.Query("SELECT * FROM users WHERE id = ?", 1)
if err != nil {log.Fatal(err)
}
defer rows.Close()for rows.Next() {var id intvar name string// 根据实际表结构定义其他列变量err = rows.Scan(&id, &name, ...)if err != nil {log.Fatal(err)}fmt.Println(id, name)
}// 示例:执行插入或更新操作
_, err = db.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "John Doe", "john.doe@example.com")
if err != nil {log.Fatal(err)
}
5. 使用连接池
为了提高性能和资源利用率,可以利用 sql.DB 自带的连接池功能:
// 初始化连接池
var maxOpenConns = 10
var maxIdleConns = 5
db.SetMaxOpenConns(maxOpenConns)
db.SetMaxIdleConns(maxIdleConns)
6. 处理事务
对于涉及到多条SQL语句需要原子性执行的情况,可以使用事务:
tx, err := db.Begin()
if err != nil {return err
}// 在事务内执行操作
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE user_id = ?", amount, userId)
if err != nil {tx.Rollback()return err
}_, err = tx.Exec("INSERT INTO transactions ...")
if err != nil {tx.Rollback()return err
}// 提交事务
err = tx.Commit()
if err != nil {return err
}
以上就是使用Go语言连接MySQL数据库并进行基本操作的一个大致流程。根据实际需求,可能还需要处理更复杂的情况,例如预编译SQL语句、分页查询、批量操作等。
二、连接字符串
Go语言连接MySQL数据库的字符串格式(DSN,Data Source Name)通常如下:
"user:password@tcp(host:port)/dbname?option=value&option2=value2..."
各个部分的含义:
user: 数据库用户名password: 密码host:port: MySQL服务器的地址和端口号,默认端口为3306/dbname: 要连接的数据库名称option=value: 可选的连接参数,比如:charset=utf8mb4: 指定字符集parseTime=true: 解析datetime和timestamp类型的值为Go的time.Time类型loc=Local: 设置时区- 其他可能的选项还包括sslmode、timeout等
举例:
dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=true&loc=Local"
而对于连接Microsoft SQL Server(MSSQL),Go语言中使用的连接字符串格式则有所不同,例如使用github.com/denisenkom/go-mssqldb驱动时,其格式类似于:
"server=<server>;user id=<username>;password=<password>;database=<dbname>;port=<port>;encrypt=<boolean>;..."
各部分含义:
server: MSSQL服务器地址,可以是IP或域名user id: 登录数据库的用户名password: 密码database: 要连接的数据库名称port: 服务器端口号,默认为1433encrypt: 是否启用SSL加密连接,可以是true或false
示例:
dsn := "server=localhost;user id=myusername;password=mypassword;database=mydb;port=1433"
总结起来,尽管两者都是连接字符串,但它们的语法和关键字差异明显,分别对应MySQL和MSSQL不同的连接约定。在实际使用时需按照相应的数据库驱动文档来构造合适的连接字符串。
三、应用示例
以下是一个完整的Go语言连接MySQL数据库并执行一些基本操作(如查询、插入和更新)的综合示例程序:
package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql"
)// 数据库连接配置
const (DBHost = "localhost"DBPort = 3306DBUser = "your_username"DBPassword = "your_password"DBName = "your_database"
)func main() {// 构建DSN(Data Source Name)dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", DBUser, DBPassword, DBHost, DBPort, DBName)// 创建数据库连接db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()// 检查连接是否成功err = db.Ping()if err != nil {log.Fatal(err)} else {fmt.Println("Successfully connected to the database.")}// 示例操作:插入一条新记录insertStmt := `INSERT INTO users (name, email) VALUES (?, ?)`result, err := db.Exec(insertStmt, "John Doe", "john.doe@example.com")if err != nil {log.Fatal(err)}lastInsertedID, err := result.LastInsertId()if err != nil {log.Fatal(err)}fmt.Printf("Inserted new user with ID: %d\n", lastInsertedID)// 示例操作:查询记录queryStmt := `SELECT id, name, email FROM users WHERE id = ?`var id intvar name, email stringrow := db.HumanRow(queryStmt, lastInsertedID)err = row.Scan(&id, &name, &email)if err != nil && err != sql.ErrNoRows {log.Fatal(err)} else if err == sql.ErrNoRows {fmt.Println("No rows found.")} else {fmt.Printf("Retrieved user info: ID=%d, Name=%s, Email=%s\n", id, name, email)}// 示例操作:更新记录updateStmt := `UPDATE users SET email = ? WHERE id = ?`res, err := db.Exec(updateStmt, "john.doe.updated@example.com", lastInsertedID)if err != nil {log.Fatal(err)}affectCount, err := res.RowsAffected()if err != nil {log.Fatal(err)}fmt.Printf("Updated %d rows.\n", affectCount)
}
注意:这个示例假设你已经有了一个名为users的表,并且表中有id(整数,主键)、name(字符串)和email(字符串)这三个字段。在实际应用中,请替换your_username、your_password和your_database为实际的数据库用户名、密码和数据库名称。同时,根据实际的表结构调整SQL语句。
四、比较
MySQL数据库与Microsoft SQL Server(MSSQL)数据库是两种广泛应用的关系型数据库管理系统(RDBMS),它们各自具有独特的特性和适用场景。以下是一些主要区别点:
-
开发背景与许可费用:
- MySQL:由瑞典MySQL AB公司开发,后来被Oracle公司收购,现在是一个开源数据库系统,遵循GPLv2协议。MySQL可以免费下载和使用,但企业版提供了额外的支持和服务选项。
- MSSQL:由微软(Microsoft)开发,是一个闭源的商业产品。使用MSSQL需要购买相应授权,有多种版本供不同规模的企业和个人选用,包括Express(免费版本)、Developer、Standard、Enterprise等。
-
跨平台支持:
- MySQL:支持多平台,可在Windows、Linux、Unix等多个操作系统上运行,具有较好的跨平台适应性。
- MSSQL:早期主要面向Windows平台,随着Azure SQL的发展,MSSQL Server现在也有了Linux版本,但核心市场仍以Windows为主。
-
性能与资源消耗:
- MySQL:以其轻量级和快速著称,尤其适合中小型网站和Web应用程序,能以较少的资源处理较高的并发请求。然而在大规模数据处理、复杂查询以及高度并发的OLTP/OLAP场景下,与高端商业数据库相比可能存在差距。
- MSSQL:在处理大型数据库和复杂事务方面表现出色,特别是对于高性能要求和大数据处理场景,提供了强大的存储过程、触发器等功能,同时也消耗更多的硬件资源。
-
功能特性:
- MySQL:具有灵活的数据类型(如ENUM和SET类型),支持LIMIT关键词,支持无符号整数类型,对Web应用友好,易于部署和扩展。但早期版本在窗口函数、XML处理、高级分析功能等方面相对薄弱。
- MSSQL:提供丰富的企业级特性,如全文搜索、数据分析服务(Analysis Services)、报表服务(Reporting Services)等。支持复杂的事务处理,提供强大的T-SQL语言,支持更加丰富的数据类型,如NVARCHAR(Unicode字符串)和NTEXT(大量Unicode文本)等。
-
管理工具与生态:
- MySQL:MySQL Workbench是一款流行的图形界面工具,但相对于SSMS(SQL Server Management Studio)而言,功能可能没有那么全面和强大。MySQL的生态系统中有很多第三方工具和插件。
- MSSQL:SSMS是专为MSSQL设计的强大管理工具,提供了一站式的数据库管理体验,包括设计、查询、备份还原、性能监视等众多功能。
-
安全性与合规性:
- MySQL:提供各种安全措施,如用户权限管理、SSL加密连接等,但对于严格的法规遵从性需求,可能需要更多定制化工作或配合其他工具。
- MSSQL:内置了丰富的审计和安全功能,满足严格的法规遵从性标准,如HIPAA、SOX等,并且能够很好地整合到微软的企业安全框架之中。
-
社区支持与生态系统:
- MySQL:作为一个开源项目,MySQL有着庞大的社区支持,许多开发者贡献代码和解决相关问题,同时有大量的开源工具和教程可供参考。
- MSSQL:虽然不是开源软件,但由于微软公司的实力,MSSQL享有专业的技术支持和稳定的更新周期,其生态系统包括大量的ISV合作伙伴、培训资源和技术文档。
总的来说,MySQL和MSSQL在很多方面都有各自的优点和应用场景。MySQL适合那些追求低成本、高可用性和易部署的中小型企业或Web应用;而MSSQL更适合需要高级企业功能、严格数据一致性保证以及紧密整合微软技术栈的大中型企业。随着两者都在不断迭代更新,一些传统的区别也在逐渐模糊,例如MSSQL引入了更多开源理念和技术,而MySQL也在不断强化企业级特性。选择哪一个取决于项目的具体需求、预算、现有技术栈以及团队熟悉程度等因素。
相关文章:
编程笔记 Golang基础 047 mysql数据库连接与操作
编程笔记 Golang基础 047 mysql数据库连接与操作 一、连接与操作1. 安装MySQL驱动2. 导入驱动包3. 连接数据库4. 执行SQL查询和操作5. 使用连接池6. 处理事务 二、连接字符串三、应用示例四、比较 MySQL凭借其开源、高效、稳定、灵活、安全以及广泛的社区支持等诸多优势&#x…...
.jsonl 格式文件的解释
根据 CHATGPT .jsonl 文件格式是一种文本文件格式,通常用于存储每行一个JSON对象的数据。.jsonl 文件的每一行都是一个独立的JSON对象,这些对象之间没有任何分隔符。 以下是一个示例.jsonl文件的内容: {"name": "John"…...
nodejs web服务器 -- 搭建开发环境
一、配置目录结构 1、使用npm生成package.json,我创建了一个nodejs_network 文件夹,cd到这个文件夹下,执行: npm init -y 其中-y的含义是yes的意思,在init的时候省去了敲回车的步骤,如此就生成了默认的pac…...
laravel-admin 头部添加操作
新建html 样式及js namespace App\Admin\Extensions\Nav;class Links {public function __toString(){return <<<HTML<li><a href"" οnclick"js_method();return false;"><i class"fa fa-floppy-o"></i><s…...
mysql笔记:10. 日志
文章目录 一、日志概述二、错误日志1. 启动2. 查看3. 删除 三、二进制日志1. 启动2. 查看3. 删除 四、通用查询日志1. 启动2. 查看3. 删除 五、慢查询日志1. 启动2. 查看3. 删除 日志是MySQL数据库的重要组成部分,日志文件中记录着MySQL数据库运行期间发生的变化。M…...
代码随想录刷题笔记-Day32
1. 最大子序和 53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/ 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组:是数组中的一个连续…...
指针的学习5
目录 sizeof和strlen的区别 sizeof strlen 数组和指针笔试题解析 一维数组 字符数组 二维数组 指针运算笔试题解析 题目1: 题目2: 题目3: 题目4: 题目5: 题目6: 题目7: sizeof和…...
Dynamo——常用几何形体的创建与编辑(二)
上一次,我们简单整理了一些创建几何形体的节点用法,今天我们接着整理一些,几何形体的编辑方法。 一、坐标点的平移复制 [Point.Add] 使用节点 “Vector.ByCoordinates” 生成一个向量,将该向量连接到 “Point.Add” 节点的输入端 …...
uniapp富文本编辑-editor-vue2-vue3-wangeditor
前言 不管vue2还是vue3,都推荐官方的editor组件, 官方手册 https://uniapp.dcloud.net.cn/component/editor.html除了“微信小程序”,其他小程序想要使用editor组件实现富文本编辑,很难 第三方组件wangeditor在vue2࿰…...
【java】22:try-catch 异常处理
try-catch 方式处理异常说明 public static void main(String[] args) { int num1 10; int num2 0; try { int res num1 / num2; } catch (Exception e) { System.out.println(e.getMessage()); } } 注意事项 1)如果异常发生了,则异常发生后面的代码不会执行&…...
【C语言】linux内核ip_local_out函数
一、讲解 这个函数 __ip_local_out 是 Linux 内核网络子系统中的函数,部分与本地出口的 IPv4 数据包发送相关。下面讲解这段代码的每一部分: 1. 函数声明 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb): -…...
动态规划6,最大数组和,环形子数组最大和,乘积最大子数组
最大子数组和 思路: 1.经验题目要求 dp[i]表示:以 i 位置为结尾的所有子数组中的最大和 2.状态转移方程 按长度来划分,如果长度为1,那么dp[i] nums[i]; 如果长度大于1,那么当前位置的最大和就为 i-1 位置最大和 …...
js 清空数组的方法
1、直接赋值空数组 let array [1, 2, 3, 4, 5]; array []; 这种方法并不推荐,如下图所示: 虽然a数组确实变为了空数组,但这种方法只是修改了a的指向,把a指向一个新的空数组,然而[1,2,3,4,5]这个数组并没有被清除&a…...
QT中使用QProcess执行命令,实时获取数据,例如进度条
前言 因为之前写了一个接收和发送文件的脚本,然后又需要获取进度,同步到进度条中。 效果: 使用正则匹配,获取命令行命令中的以下数据,然后同步到进度条 源码demo: 非完整代码: #include <Q…...
绘图设计:用Draw.io绘制图形技巧大全(含统一建模语言UML模板)
一、常见UML模板 1.流程图 2.用例图 include是包含关系,extend是扩展关系 简而言之,include是子集指向父集;而extend是扩展用例指向基础用例(基础用例可以理解为系统核心功能,扩展用例是可选的,不是必须…...
被唤醒的“第二十条”深入人心
近来张艺谋执导的电影《第二十条》,因为它与正在召开中的全国两会所发布的《最高人民法院工作报告》联系相当紧密,加之可免费收看,网民便相互转告,于是此信息条目立即冲上了网络热搜榜,观者如潮。因为最高人民法院工作…...
PHPInfo()信息泄漏原理以及修复方法
漏洞名称:PHPInfo信息泄漏、phpinfo()函数信息泄漏 漏洞描述: phpinfo()函数返回的信息中包含了服务器的配置信息,包括: 1)PHP编译选项以及文件扩展名的相关信息; 2)php的版本信息 3&#…...
202441读书笔记|《笠翁对韵》—— 金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双
202441读书笔记|《笠翁对韵》——金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双 《作家榜名著:笠翁对韵》作者李渔,霍俊明。是所有词句都有注音的一本书,轻松学不认识的字,非常朗朗上口的对偶词…...
006-v-model原理
v-model原理 简介v-model应用在输入框上v-model应用在组件上 简介 由 属性绑定(v-bind:value“searchText”) 配合 input事件监听(v-on:input“searchText event.target.value”) 实现。 应用在组件上由 props: {value: xxx } ,this.$emit(‘input’, xxx ) 完成。…...
Ubuntu下使用DAPLink(OpenOCD)
目录 1. 下载OpenOCD源代码 2. 编译代码 2.1 运行bootstrap 2.2 安装关联库 2.3 运行./configure 2.4 运行make 2.5 运行sudo make install 3. 烧录程序 3.1 挂起MCU 3.2 写入镜像 3.3 校验镜像 通过OpenOCD实现,在Ubuntu18 64bit下验证。 1. 下载OpenOC…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
