编程笔记 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…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
一、汇编代码 上一节开始,讲到了很多debug编译独有的汇编方式,为了更好的区分release的编译器优化和debug的区别,从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...
python打卡第48天
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 **…...