编程笔记 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…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
