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

golang学习笔记18——golang 访问 mysql 数据库全解析

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • 基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • golang学习笔记01——基本数据类型
    • golang学习笔记02——gin框架及基本原理
    • golang学习笔记03——gin框架的核心数据结构
    • golang学习笔记04——如何真正写好Golang代码?
    • golang学习笔记05——golang协程池,怎么实现协程池?
    • golang学习笔记06——怎么实现本地文件及目录监控-fsnotify
    • golang学习笔记07——使用gzip压缩字符减少redis等存储占用的实现
    • golang学习笔记08——如何调用阿里oss sdk实现访问对象存储?
    • golang学习笔记09——golang优秀开发常用开源库汇总
    • golang学习笔记10——golang 的 Gin 框架,快速构建高效 Web 应用
    • golang学习笔记11——Go 语言的并发与同步实现详解
    • golang学习笔记12——Go 语言内存管理详解
    • golang学习笔记13——golang的错误处理深度剖析
    • golang学习笔记14——golang性能问题的处理方法
    • golang学习笔记15——golang依赖管理方法
    • golang学习笔记16——golang部署与运维全攻略
    • golang学习笔记17——golang使用go-kit框架搭建微服务详解

文章目录

    • 准备工作
      • 1.安装 MySQL 驱动
      • 2.导入必要的包
    • 建立数据库连接
      • 1.连接字符串
      • 2.建立连接
    • 执行 SQL 查询
      • 1.简单查询示例(查询单条记录)
      • 2.查询多条记录
    • 执行 SQL 更新操作(插入、更新、删除)
      • 1.插入数据示例
      • 2.更新数据示例
      • 3.删除数据示例
    • 事务处理
      • 1.事务的概念
      • 2.示例代码

在现代软件开发中,数据存储和访问是至关重要的环节。MySQL 作为一款流行的关系型数据库,经常需要与各种编程语言进行交互。Golang 以其高效、简洁的特性,在数据库访问方面也有着出色的表现。本文将详细介绍 Golang 如何访问 MySQL 数据库,并配合代码示例进行说明。

准备工作

1.安装 MySQL 驱动

  • 在 Golang 中,要访问 MySQL 数据库,首先需要安装相应的数据库驱动。Go - SQL - Driver 是一个广泛使用的 MySQL 驱动,我们可以使用go get命令来安装它:
     go get -u github.com/go - sql - driver/mysql

2.导入必要的包

  • 在 Go 代码中,我们需要导入database/sql包和刚刚安装的 MySQL 驱动包:
     import ("database/sql""fmt""github.com/go - sql - driver/mysql")

建立数据库连接

1.连接字符串

  • 连接 MySQL 数据库需要构建一个连接字符串,它包含了数据库的相关信息,如用户名、密码、主机地址、端口号和数据库名等。连接字符串的格式如下:
     user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local
  • 其中,user是 MySQL 的用户名,password是对应的密码,tcp(127.0.0.1:3306)表示数据库的主机地址(这里是本地地址和默认端口),your_database是要连接的数据库名称,charset=utf8mb4指定字符集,parseTime=True用于自动解析时间类型,loc = Local设置时区。

2.建立连接

  • 使用sql.Open函数来打开一个数据库连接,它返回一个*sql.DB对象和一个可能的错误:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()}
  • 这里的defer db.Close()语句确保在函数结束时关闭数据库连接,以释放资源。

执行 SQL 查询

1.简单查询示例(查询单条记录)

  • 以下是一个查询数据库中一条记录的示例。假设我们有一个名为users的表,包含id、name和age列:
     func main() {// 建立数据库连接db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()// 查询语句var name stringvar age interr = db.QueryRow("SELECT name, age FROM users WHERE id = 1").Scan(&name, &age)if err!= nil {fmt.Println("查询失败:", err)return}fmt.Printf("姓名: %s, 年龄: %d\n", name, age)}
  • 在这个示例中,我们使用QueryRow函数执行查询语句,它返回一个*sql.Row对象。然后使用Scan方法将查询结果映射到我们定义的变量name和age上。

2.查询多条记录

  • 当需要查询多条记录时,我们使用Query函数。以下是一个查询users表中所有记录的示例:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()rows, err := db.Query("SELECT name, age FROM users")if err!= nil {fmt.Println("查询失败:", err)return}defer rows.Close()for rows.Next() {var name stringvar age interr = rows.Scan(&name, &age)if err!= nil {fmt.Println("扫描结果失败:", err)return}fmt.Printf("姓名: %s, 年龄: %d\n", name, age)}if err = rows.Err(); err!= nil {fmt.Println("迭代结果集时出错:", err)}}
  • 这里我们首先使用Query函数得到一个*sql.Rows对象,然后使用Next方法遍历结果集,通过Scan方法获取每一行的数据。最后,我们使用rows.Err()检查在遍历过程中是否出现错误。

执行 SQL 更新操作(插入、更新、删除)

1.插入数据示例

  • 假设我们要向users表中插入一条新记录:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()// 插入语句result, err := db.Exec("INSERT INTO users (name, age) VALUES ('John', 25)")if err!= nil {fmt.Println("插入失败:", err)return}id, err := result.LastInsertId()if err!= nil {fmt.Println("获取插入的ID失败:", err)return}fmt.Printf("插入成功, 新记录的ID: %d\n", id)}
  • 在这个示例中,我们使用Exec函数执行插入语句,它返回一个sql.Result对象。我们可以通过LastInsertId方法获取新插入记录的自增 ID。

2.更新数据示例

  • 以下是更新users表中一条记录的示例:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()// 更新语句result, err := db.Exec("UPDATE users SET age = 26 WHERE id = 1")if err!= nil {fmt.Println("更新失败:", err)return}rowsAffected, err := result.RowsAffected()if err!= nil {fmt.Println("获取受影响的行数失败:", err)return}fmt.Printf("更新成功, 受影响的行数: %d\n", rowsAffected)}
  • 这里使用Exec函数执行更新语句,通过RowsAffected方法获取更新操作影响的行数。

3.删除数据示例

  • 假设要删除users表中的一条记录:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()// 删除语句result, err := db.Exec("DELETE FROM users WHERE id = 1")if err!= nil {fmt.Println("删除失败:", err)return}rowsAffected, err := result.RowsAffected()if err!= nil {fmt.Println("获取受影响的行数失败:", err)return}fmt.Printf("删除成功, 受影响的行数: %d\n", rowsAffected)}
  • 同样使用Exec函数执行删除语句,并通过RowsAffected方法获取受影响的行数。

事务处理

1.事务的概念

  • 事务是一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚。在 Golang 中,我们可以方便地使用Begin、Commit和Rollback方法来处理事务。

2.示例代码

  • 以下是一个事务处理的示例,假设我们要向users表中插入两条记录,如果其中一条插入失败,则回滚整个操作:
     func main() {db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil {fmt.Println("数据库连接失败:", err)return}defer db.Close()tx, err := db.Begin()if err!= nil {fmt.Println("开始事务失败:", err)return}// 插入第一条记录_, err = tx.Exec("INSERT INTO users (name, age) VALUES ('Alice', 22)")if err!= nil {// 如果插入失败,回滚事务tx.Rollback()fmt.Println("插入第一条记录失败:", err)return}// 插入第二条记录_, err = tx.Exec("INSERT INTO users (name, age) VALUES ('Bob', 23)")if err!= nil {// 如果插入失败,回滚事务tx.Rollback()fmt.Println("插入第二条记录失败:", err)return}// 提交事务tx.Commit()fmt.Println("两条记录插入成功")}
  • 在这个示例中,我们首先使用Begin方法开始一个事务,得到一个*sql.Tx对象。然后执行两条插入语句,如果其中任何一条出现错误,我们使用Rollback方法回滚事务。如果两条插入语句都成功执行,我们使用Commit方法提交事务。

通过以上步骤,我们可以在 Golang 中有效地访问 MySQL 数据库,进行各种查询和操作。在实际应用中,我们可以根据具体的业务需求灵活运用这些方法,构建强大而高效的数据库应用程序。

关注我看更多有意思的文章哦!👉👉

相关文章:

golang学习笔记18——golang 访问 mysql 数据库全解析

推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…...

苹果账号登录后端验证两种方式 python2

import time import jwt import requests import json import base64def decode_jwt(jwt_token):try:h,p,s jwt_token.split(.)except:return {},{},{},"","",""header json.loads(base64.urlsafe_b64decode(h )) # 可能需要调整填充pa…...

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…...

《 C++ 修炼全景指南:六 》深入探索 C++ 标准库中的 stack 与 queue 容器适配器

1、引言 1.1、容器适配器的概念与应用 容器适配器&#xff08;Container Adapters&#xff09;是 C 标准库提供的一种特殊容器&#xff0c;它不是一种独立的容器&#xff0c;而是对其他标准容器的封装&#xff0c;用来实现特定的数据结构如栈&#xff08;stack&#xff09;和…...

高级java每日一道面试题-2024年9月07日-JVM篇-说一下类加载的执行过程?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下类加载的执行过程? 我回答: 在Java中&#xff0c;类的加载是一个重要的过程&#xff0c;它是由Java虚拟机&#xff08;JVM&#xff09;的类加载器系统负责的。类加载的过程不仅仅包括加载类的字节码到内存中&#xff0c;还包…...

笔试强训day09

添加逗号 import sysa list(input())[::-1] s "" cnt 0 for v in a:cnt 1s vif cnt%30:s , print(s.rstrip(,)[::-1])跳台阶 import sys import functools functools.cache def dfs(u):if u1 or u2:# print(f"u {u}")return ureturn dfs(u-1)dfs(…...

软件测试中的黑盒测试方法,包括其定义、目的及主要步骤。

黑盒测试&#xff08;Black Box Testing&#xff09;是一种软件测试方法&#xff0c;它侧重于软件的功能性需求验证&#xff0c;而不考虑程序内部结构或代码实现细节。这种方法是从最终用户的角度出发&#xff0c;检查系统是否按照规格说明书的要求工作。黑盒测试的主要目的是验…...

Shell脚本计算π的近似值

计算π的公式很多,本文使用“π的莱布尼茨公式”来计算π的近似值,对应的公式如下: http://upload.wikimedia.org/math/9/e/8/9e804b8a1a11e442be93fed1d52205a9.png 由此我们可以得到求解π的公式为:π=4*(1-(1/3)+(1/5)-(1/7)+(1/9)...) 下面是在linux下使用shell脚本命令…...

进程间通信之消息队列

作用 进程间通信 特点 1 、消息队列中的消息是有类型的。 类型 : 自定义的结构体 , 第一个成员必须是 long 型的 . 表示为该消息的类型 如 : typedef struct 结构体名称 { long type; // 消息的正文 char name[50]; char sex[10]; int age; ... } 别名 ; 2 、消息队…...

人生苦短我用Python 5-xlwings自动调整表格

人生苦短我用Python 5-xlwings自动调整表格 前言依赖主要类App类Books类Sheet 类 示例代码 前言 使用pandas库openpyxl库实现了csv与excel文件的互相转换&#xff0c;csv转excel后若数据超出了单元格的宽度&#xff0c;部分数据无法完整显示。需要手动打开Excel文件&#xff0…...

移动跨平台框架Flutter详细介绍和学习线路分享

Flutter是一款移动应用程序SDK&#xff0c;一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。 在全世界&#xff0c;Flutter正在被越…...

线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解

线性代数基础&#xff1a;向量、矩阵、张量及其在机器学习中的应用详解 线性代数基础&#xff1a;向量、矩阵、张量及其在机器学习中的应用详解一、向量 (Vectors)1. 向量的定义2. 向量在机器学习中的应用3. 向量空间 二、矩阵 (Matrices)1. 矩阵的定义2. 矩阵在机器学习中的应…...

Dockerfile中的RUN、CMD、ENTRYPOINT指令区别

RUN在构建过程中在镜像中执行命令。CMD容器创建时的默认命令。&#xff08;可以被覆盖&#xff09;ENTRYPOINT容器创建时的主要命令。&#xff08;不可被覆盖&#xff09; 指令介绍 1.RUN 在构建过程中在镜像中执行命令&#xff0c;是在 docker build中执行 2.CMD 作用&am…...

css grid布局属性详解

Grid布局 前言一、认识Grid1.1容器和项目1.2行和列1.3单元格和网格线 二、容器属性2.1.grid-template-columns与grid-template-rows属性2.1.1 直接使用长度单位比如px2.1.2 使用百分比 %2.1.3 使用repeat函数2.1.4 按比例划分 fr 关键字2.1.5 自动填充 auto 关键字2.1.6 最大值…...

Tranformer分布式特辑

随着大模型的发展&#xff0c;如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时&#xff0c;不存储当前节点的中间结果&#xff0c;在反向传播时重新计算&#xff0c;从而起到降低显存占用的作用 Low Precision…...

【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务

#include <rclcpp/rclcpp.hpp> // ROS 2 的核心库 #include <moveit/planning_scene/planning_scene.h> // MoveIt 规划场景相关的头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h> // MoveIt 规划场景接口 #include <m…...

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…...

JVM字节码

JVM字节码详解 引言 JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;字节码是一种中间代码&#xff0c;主要用于Java平台上的程序在不同硬件平台上的移植。Java程序通过编译器将源代码编译成字节码&#xff0c;然后通过JVM解释或即时编译&#xff08…...

python访问mysql

要在 Python 中访问 MySQL 数据库&#xff0c;通常会使用 mysql-connector-python 或 pymysql 这两个库之一。以下是使用这两个库的基本示例&#xff1a; 使用 mysql-connector-python 安装库: pip install mysql-connector-python示例代码: import mysql.connector# 连接到 M…...

Java工具插件

一、springboot集成mqtt订阅 阿里云MQTT使用教程_复杂的世界311的博客-CSDN博客_阿里云mqtt 阿里云创建MQTT服务 先找到产品与服务,然后选择物联网平台,找到公共实例,创建一个产品。 创建产品 然后在左侧下拉栏找到设备管理,在设备管理下拉栏找到设备,然后添加设备。添加…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...