当前位置: 首页 > news >正文

【MySQL】Go操作MySQL从入门到实战:环境搭建+语法+CRUD全解析

一、Go 开发环境准备

1. Windows 安装 Go

  • 官方下载地址:https://golang.google.cn/dl/(推荐下载稳定版)

  • 避坑提醒:win10 安装时若出现错误代码 2503/2502,可参考这篇解决方案:https://jingyan.baidu.com/article/75ab0bcb9de916d6874db25a.html

  • 环境变量配置:安装完成后,右键「此电脑」→「属性」→「高级系统设置」→「环境变量」,在系统变量中添加GOROOT(Go 安装路径)和GOPATH(工作目录),并将%GOROOT%\bin添加到 Path 中

  • 验证安装:打开 CMD 输入以下命令,显示版本号即为成功

go version

2. 安装 Go 编译器 GoLand

  • 官网下载地址:https://www.jetbrains.com/go/download/?section=windows(支持免费试用 30 天)

  • 简单配置:安装后新建 Go 项目,选择 GOPATH 路径即可开始编码

3. 第一个 Go 程序(验证环境)

新建hello.go文件,写入以下代码:

packagemainimport"fmt"funcmain(){fmt.Println("Hello, MySQL!")// 输出问候语,验证环境是否正常}

运行命令:

go run hello.go

若控制台输出Hello, MySQL!,说明环境搭建完成~

二、Go 基础语法速通(为操作 MySQL 铺垫)

1. 变量赋值与输出

Go 的变量声明支持多种方式,灵活度很高:

packagemainimport"fmt"funcmain(){varintA=10// 自动推导类型varcharA="a"// 字符串类型varcharBstring="b"// 显式声明类型intB:=20// 短变量声明(仅支持函数内)varintC,intD=30,40// 多变量同时声明// 三种输出方式对比fmt.Print("不换行输出:")// 不自动换行fmt.Printf("intA=%v, intB=%v\n",intA,intB)// 格式化输出(推荐)fmt.Println("换行输出:",charA,charB,intC,intD)// 自动换行}

运行结果:

2. 数组与切片(存储查询结果常用)

切片是 Go 中最常用的数据结构,比数组更灵活:

packagemainimport"fmt"funcmain(){// 数组(固定长度)level:=[3]string{"初级","中级","高级"}fmt.Println("数组:",level[0])// 访问数组元素// 切片(动态长度)varnames[]string// 声明空切片num:=[]int{1,2,3,4,5}// 初始化带元素的切片// 切片截取(左闭右开)slice:=num[1:3]// 截取索引1-2的元素,结果:[2,3]fmt.Println("切片截取:",slice)// 切片添加元素(返回新切片)names=append(names,"zhangsan")fmt.Println("添加元素后:",names)// 结果:[zhangsan]}

3. 结构体(映射 MySQL 表数据)

操作数据库时,常用结构体存储一行数据:

packagemainimport"fmt"funcmain(){// 条件判断(成绩评级)score:=85vargradestringifscore>=90{grade="A"}elseifscore>=80{grade="B"}elseifscore>=60{grade="C"}else{grade="F"}fmt.Printf("成绩:%d,评级:%s\n",score,grade)// 循环(遍历切片)fruits:=[]string{"苹果","香蕉","橙子"}forindex,fruit:=rangefruits{fmt.Printf("索引:%d,水果:%s\n",index,fruit)}}

4. 循环与条件判断(数据处理常用)
packagemainimport"fmt"funcmain(){// 条件判断(成绩评级)score:=85vargradestringifscore>=90{grade="A"}elseifscore>=80{grade="B"}elseifscore>=60{grade="C"}else{grade="F"}fmt.Printf("成绩:%d,评级:%s\n",score,grade)// 循环(遍历切片)fruits:=[]string{"苹果","香蕉","橙子"}forindex,fruit:=rangefruits{fmt.Printf("索引:%d,水果:%s\n",index,fruit)}}

三、Go 操作 MySQL 实战(核心部分)

1. 前置准备:创建 MySQL 用户和表

首先在 MySQL 中执行以下 SQL,创建测试用户和表:

-- 创建Go专用操作用户CREATEUSER'go_rw'@'%'IDENTIFIEDBY'Ud7q_dac8';-- 授权增删改查权限GRANTinsert,delete,select,updateONmaria.*TO'go_rw'@'%';-- 切换数据库USEmaria;-- 创建用户表CREATETABLEuser_info(idINTAUTO_INCREMENTPRIMARYKEY,-- 自增主键nameVARCHAR(255)NOTNULL,-- 姓名ageINTNOTNULL-- 年龄);
2. Go 操作 MySQL 核心代码
步骤 1:安装 MySQL 驱动依赖

打开终端,执行以下命令安装 Go 的 MySQL 驱动:

go get github.com/go-sql-driver/mysql
步骤 2:完整 CRUD 代码实现
packagemainimport("database/sql""fmt"// MySQL驱动(下划线表示只导入不使用,底层会自动注册)_"github.com/go-sql-driver/mysql")// UserInfo 结构体映射user_info表typeUserInfostruct{IDint`db:"id"`Namestring`db:"name"`Ageint`db:"age"`}funcmain(){// 1. 连接MySQL数据库// 连接格式:用户名:密码@tcp(IP:端口)/数据库名?charset=utf8mb4db,err:=sql.Open("mysql","go_rw:Ud7q_dac8@tcp(192.168.184.151:3306)/maria?charset=utf8mb4")iferr!=nil{panic("数据库连接失败:"+err.Error())}deferdb.Close()// 延迟关闭连接(程序结束前执行)// 验证连接是否有效err=db.Ping()iferr!=nil{panic("连接验证失败:"+err.Error())}fmt.Println("数据库连接成功!")// 2. 插入数据(使用预编译防止SQL注入)insertSQL:="INSERT INTO user_info(name, age) VALUES(?, ?)"stmt,err:=db.Prepare(insertSQL)iferr!=nil{panic("预编译插入SQL失败:"+err.Error())}deferstmt.Close()// 执行插入(参数对应SQL中的?)result,err:=stmt.Exec("John Doe",25)iferr!=nil{panic("插入数据失败:"+err.Error())}insertID,_:=result.LastInsertId()fmt.Printf("插入成功,新记录ID:%d\n",insertID)// 3. 查询数据querySQL:="SELECT id, name, age FROM user_info"rows,err:=db.Query(querySQL)iferr!=nil{panic("查询数据失败:"+err.Error())}deferrows.Close()varusers[]UserInfo// 存储查询结果forrows.Next(){varuser UserInfo// 扫描行数据到结构体(字段顺序需与查询语句一致)err:=rows.Scan(&user.ID,&user.Name,&user.Age)iferr!=nil{panic("数据扫描失败:"+err.Error())}users=append(users,user)}// 打印查询结果fmt.Println("\n查询结果:")for_,u:=rangeusers{fmt.Printf("ID:%d,姓名:%s,年龄:%d\n",u.ID,u.Name,u.Age)}// 4. 更新数据updateSQL:="UPDATE user_info SET name=?, age=? WHERE id=?"stmtUpdate,err:=db.Prepare(updateSQL)iferr!=nil{panic("预编译更新SQL失败:"+err.Error())}deferstmtUpdate.Close()resultUpdate,err:=stmtUpdate.Exec("Jane Smith",30,insertID)iferr!=nil{panic("更新数据失败:"+err.Error())}affectedRows,_:=resultUpdate.RowsAffected()fmt.Printf("\n更新成功,影响行数:%d\n",affectedRows)// 5. 删除数据deleteSQL:="DELETE FROM user_info WHERE id=?"stmtDelete,err:=db.Prepare(deleteSQL)iferr!=nil{panic("预编译删除SQL失败:"+err.Error())}deferstmtDelete.Close()resultDelete,err:=stmtDelete.Exec(insertID)iferr!=nil{panic("删除数据失败:"+err.Error())}deleteRows,_:=resultDelete.RowsAffected()fmt.Printf("删除成功,影响行数:%d\n",deleteRows)}
步骤 3:运行代码

将上述代码保存为mysql_demo.go,在终端执行:

go run mysql_demo.go

成功运行后,控制台输出如下:

四、注意事项与常见问题

  1. 连接失败:检查 MySQL 服务是否启动、IP / 端口是否正确、用户名密码是否匹配、防火墙是否开放 3306 端口

  2. SQL 注入风险:务必使用Prepare预编译 +?占位符,避免直接拼接 SQL 字符串

  3. 字符编码:连接 URL 中添加charset=utf8mb4,支持 emoji 等特殊字符

  4. 资源释放:使用defer关闭数据库连接、语句对象、结果集,避免资源泄露

  5. 错误处理:实际开发中不要用panic,应使用if err != nil捕获并处理错误

http://www.jsqmd.com/news/476615/

相关文章:

  • 2026年3月光伏用传感器供应商口碑排行,值得关注,电压互感器/互感器/电流互感器/漏电传感器,传感器定制排行 - 品牌推荐师
  • 如何集成单点登录和设计子系统的权限管理二
  • 南大复试 - 软工真题
  • 从霍尔信号到六步换向:有霍尔BLDC电机驱动实战解析
  • 【AI改变未来】从技术突破到行业重塑,我们正站在智能革命的奇点上
  • BUUCTF [GWCTF 2019] 数据库的秘密:CVE-2018-12613漏洞实战解析
  • STM32CubeMx 配置三相互补PWM + 死区时间计算
  • 一、JavaScript 获取系统时间
  • 初始Python篇(10)—— 初识 类与对象
  • HTML5的结构、概述、优势
  • 基于Zabbix 6.4与Helm 3的Kubernetes 1.28集群监控实战指南
  • OpenClaw 生成测试用例
  • 前端工程化实践:前端项目打包命名策略全解析
  • 从对接构象到稳定轨迹:氧合血红素cpdI复合物Amber/Gromacs模拟全流程解析
  • Highcharts React v4.2.1 正式发布:更自然的React开发体验,更清晰的数据处理
  • 2026年性价比轿车托运服务商深度评测与选购指南 - 2026年企业推荐榜
  • No.905 S7-200 PLC和组态王组态温度PID控制加热 S7-200 PLC和组态王...
  • 2026年郑州黄金回收店深度测评:基于检测实力与资金安全的五维对比 - 品牌推荐
  • Windows 11 VBS与eNSP兼容性冲突:从原理到实战解决启动报错40
  • SQL优化新纪元:从索引策略到查询性能的全面提升
  • 推荐一个实用的网址导航站:jiafangbb.com
  • AI人机协同从前沿选题挖掘、智能写作工程、顶刊图表可视化、到精准选刊投稿与审稿博弈策略的一站式实践
  • 离散数学实战解析:命题公式类型判定与优化方法
  • openclaw v2026.3.11正式发布:安全强化、内核优化与跨平台体验全面升级
  • 现代密码学——第一章密码学基础
  • DeepSeek 与 Gemini:从架构到场景的深度技术选型指南
  • 使用 OpenClaw 时常见问题与解决方法:从安装到接入模型、飞书等工具的完整排查指南
  • Markdown 使用技巧大全:从入门到精通,一篇就够了
  • No.363 S7-200智能控制核心在船舶电站控制系统的应用与组态王软件的研究
  • OpenClaw引爆AI执行革命:低代码的下一个十年,从“拖拽“到“自主开发“