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

30天学会Go--第9天 GO语言 Mysql 学习与实践

30天学会Go–第9天 GO语言 MySQL学习与实践

文章目录

  • 30天学会Go--第9天 GO语言 MySQL学习与实践
    • 前言
    • 一、MySQL 基础知识
      • 1.1 MySQL 的核心特征
      • 1.2 MySQL 的常见使用情景
    • 二、安装 MySQL
      • 2.1 Windows 安装
      • 2.2 macOS 安装
      • 2.3 Linux 安装
    • 三、MySQL 常用命令
      • 3.1 数据库操作
      • 3.2 表操作
      • 3.3 数据操作
    • 四、在Go使用 `database/sql` 操作 MySQL
      • 4.1 安装 MySQL 驱动
      • 4.2 连接 MySQL
      • 4.3 增删改查操作
        • 4.3.1 插入数据
        • 4.3.2 查询数据
        • 4.3.3 更新数据
        • 4.3.4 删除数据
    • 五、使用 GORM 来简化数据库操作
      • 5.1 安装 GORM
      • 5.2 初始化 GORM
      • 5.3 定义模型
      • 5.4 自动迁移
      • 5.5 增删改查操作
        • 5.5.1 插入数据
        • 5.5.2 查询数据
        • 5.5.3 更新数据
        • 5.5.4 删除数据
    • 六、总结

前言

在后端开发中,数据库是不可或缺的组成部分,而 MySQL 是最流行的关系型数据库之一。Go 语言为操作 MySQL 提供了多种方式,包括标准库 database/sql 和更高级的 ORM 框架(如 GORM)。本章将带你学习如何在 Go 中使用 MySQL,掌握从基础到高级的数据库操作技巧。

MySQL中文官方文档指南:MySQL 中文文档 | MySQL 中文网

MySQL的中文官方文档学习笔记很全,推荐去官网学习

非关系数据库(nosql)Redis传送点:30天学会Go–第7天 GO语言 Redis 学习与实践(改)-CSDN博客


一、MySQL 基础知识

1.1 MySQL 的核心特征

MySQL 是一个开源的关系型数据库管理系统(RDBMS),因其高性能、稳定性和易用性而广泛应用。以下是 MySQL 的核心特征:

  1. 开源免费:MySQL 是一个开源项目,开发者可以免费使用,同时也提供企业版以满足高级需求。
  2. 跨平台支持:支持多种操作系统,包括 Windows、Linux 和 macOS。
  3. 高性能:MySQL 能够处理高并发的读写操作,适合大规模应用场景。
  4. 支持事务:通过 InnoDB 存储引擎支持事务处理,提供 ACID 特性(原子性、一致性、隔离性、持久性)。
  5. 灵活的存储引擎:支持多种存储引擎(如 InnoDB、MyISAM 等),开发者可以根据需求选择合适的引擎。
  6. 丰富的生态系统:拥有强大的社区支持和丰富的第三方工具(如备份工具、监控工具等)。

1.2 MySQL 的常见使用情景

MySQL 因其高性能和灵活性,被广泛应用于多种场景中,以下是一些典型的使用情景:

  1. Web 应用开发:
    • MySQL 是 LAMP(Linux、Apache、MySQL、PHP/Python/Perl)架构中的重要组成部分,广泛用于构建动态网站和内容管理系统(CMS)。
    • 例如:WordPress、Joomla 等开源 CMS 都使用 MySQL 作为默认数据库。
  2. 电子商务平台:
    • 适用于高并发的订单处理和商品管理系统。
    • 例如:Shopify 和 Magento 等电商平台使用 MySQL 作为核心数据库。
  3. 数据仓库和分析:
    • 通过 MySQL 的分区和索引功能,可以存储和分析大量数据。
    • 例如:企业报表系统和数据分析工具。
  4. 移动应用后端:
    • 作为移动应用的后端数据库,用于存储用户数据、消息和日志。
    • 例如:社交媒体应用和即时通讯工具。
  5. 分布式系统:
    • 配合主从复制和分布式架构,MySQL 能够支持大规模分布式系统。
    • 例如:高可用的微服务架构。

二、安装 MySQL

2.1 Windows 安装

  • 下载 MySQL 安装程序:https://dev.mysql.com/downloads/mysql/
  • 按照安装向导完成安装。
  • 配置环境变量(可选)。
    推荐安装链接:MySQL超详细安装配置教程(亲测有效)

2.2 macOS 安装

使用 Homebrew 安装 MySQL:

brew install mysql
brew services start mysql

2.3 Linux 安装

在 Ubuntu 系统中安装 MySQL:

sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql

输入下面代码开启mysql服务:

net start mysql

可以通过以下命令登录 MySQL:

mysql -u root -p

三、MySQL 常用命令

以下是一些常用的 MySQL 命令,帮助你快速上手。

3.1 数据库操作

-- 创建数据库
CREATE DATABASE go_demo;-- 查看所有数据库
SHOW DATABASES;-- 使用数据库
USE go_demo;-- 删除数据库
DROP DATABASE go_demo;

3.2 表操作

-- 创建表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT NOT NULL,email VARCHAR(100) NOT NULL
);-- 查看所有表
SHOW TABLES;-- 查看表结构
DESCRIBE users;-- 删除表
DROP TABLE users;

3.3 数据操作

-- 插入数据
INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com');-- 查询数据
SELECT * FROM users;-- 更新数据
UPDATE users SET age = 30 WHERE name = 'Alice';-- 删除数据
DELETE FROM users WHERE name = 'Alice';

四、在Go使用 database/sql 操作 MySQL

Go 标准库 database/sql 提供了对数据库的基本操作接口。以下是使用 database/sql 操作 MySQL 的完整实践。

4.1 安装 MySQL 驱动

Go 的标准库需要驱动来支持 MySQL,我们使用 go-sql-driver/mysql 驱动:

go get -u github.com/go-sql-driver/mysql

4.2 连接 MySQL

以下是连接 MySQL 的示例代码:

package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动
)func main() {// 数据库连接信息dsn := "root:password@tcp(127.0.0.1:3306)/go_demo" // 替换为你的 MySQL 用户名和密码// 打开数据库连接db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal("Failed to connect to database:", err)}defer db.Close()// 测试数据库连接err = db.Ping()if err != nil {log.Fatal("Failed to ping database:", err)}fmt.Println("Successfully connected to MySQL!")
}

4.3 增删改查操作

4.3.1 插入数据
result, err := db.Exec("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", "Bob", 28, "bob@example.com")
if err != nil {log.Fatal("Failed to insert data:", err)
}
id, _ := result.LastInsertId()
fmt.Println("Inserted record ID:", id)
4.3.2 查询数据
rows, err := db.Query("SELECT id, name, age, email FROM users")
if err != nil {log.Fatal("Failed to query data:", err)
}
defer rows.Close()for rows.Next() {var id intvar name stringvar age intvar email stringerr := rows.Scan(&id, &name, &age, &email)if err != nil {log.Fatal("Failed to scan row:", err)}fmt.Printf("User: ID=%d, Name=%s, Age=%d, Email=%s\n", id, name, age, email)
}
4.3.3 更新数据
result, err := db.Exec("UPDATE users SET age = ? WHERE name = ?", 35, "Bob")
if err != nil {log.Fatal("Failed to update data:", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Println("Number of rows updated:", rowsAffected)
4.3.4 删除数据
result, err := db.Exec("DELETE FROM users WHERE name = ?", "Bob")
if err != nil {log.Fatal("Failed to delete data:", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Println("Number of rows deleted:", rowsAffected)

五、使用 GORM 来简化数据库操作

database/sql 提供了基础的数据库操作接口,但操作较为繁琐。GORM 是 Go 语言中最流行的 ORM 框架,能够大幅简化数据库操作。

5.1 安装 GORM

安装 GORM 和 MySQL 驱动:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

5.2 初始化 GORM

以下是使用 GORM 连接 MySQL 的示例:

package mainimport ("fmt""log""gorm.io/driver/mysql""gorm.io/gorm"
)func main() {// 数据库连接信息dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal("Failed to connect to database:", err)}fmt.Println("Successfully connected to MySQL with GORM!")
}

5.3 定义模型

type User struct {ID    uint   `gorm:"primaryKey"`Name  stringAge   intEmail string
}

5.4 自动迁移

db.AutoMigrate(&User{})

5.5 增删改查操作

5.5.1 插入数据
user := User{Name: "Alice", Age: 25, Email: "alice@example.com"}
db.Create(&user)
fmt.Println("Inserted record ID:", user.ID)
5.5.2 查询数据
var users []User
db.Find(&users)
for _, user := range users {fmt.Printf("User: ID=%d, Name=%s, Age=%d, Email=%s\n", user.ID, user.Name, user.Age, user.Email)
}
5.5.3 更新数据
db.Model(&User{}).Where("name = ?", "Alice").Update("Age", 30)
5.5.4 删除数据
db.Delete(&User{}, 1) // 删除 ID 为 1 的用户

六、总结

通过章节学习,你已经掌握了以下内容:

  1. MySQL 的基础知识和常用命令。
  2. 使用 database/sql 操作 MySQL 的增删改查。
  3. 使用 GORM 简化数据库操作。

相关文章:

30天学会Go--第9天 GO语言 Mysql 学习与实践

30天学会Go–第9天 GO语言 MySQL学习与实践 文章目录 30天学会Go--第9天 GO语言 MySQL学习与实践前言一、MySQL 基础知识1.1 MySQL 的核心特征1.2 MySQL 的常见使用情景 二、安装 MySQL2.1 Windows 安装2.2 macOS 安装2.3 Linux 安装 三、MySQL 常用命令3.1 数据库操作3.2 表操…...

跟李笑来学美式俚语(Most Common American Idioms): Part 54

Most Common American Idioms: Part 54 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...

Angular由一个bug说起之十一:排序之后无法展开 Row

问题现象 在使用 Material Table 时,排序功能触发了一个奇怪的 Bug:表格的 Row 无法展开。最终排查发现,问题的根源在于 trackBy 的错误使用。trackBy 方法接受两个参数:index(数据索引)和 row(…...

使用 Flutter 进行移动应用开发:深入探索

文章目录 前言一、介绍二、安装 Flutter 环境三、Flutter 应用结构与基础组件四、状态管理策略五、高级主题结语 前言 随着移动技术的迅猛发展,跨平台开发的需求日益增长。开发者们一直在寻找一种既能保证应用性能又能减少开发成本和时间的技术方案。Flutter 应运而…...

2024年天津市职业院校技能大赛高职组 “信息安全管理与评估”样题第三阶段

(四)第三阶段竞小组(赛项)目(300分) 第三阶段竞赛内容是:网络安全渗透(夺旗挑战赛CTF) 本模块要求参赛者作为攻击方,运用所学的信息收集、漏洞发现、漏洞利用等渗透测试技…...

docker批量创建cloudstack虚拟主机脚本

批量创建cloudstack脚本 #!/bin/bash # 配置变量 container_prefix"cloudworker-" base_ip"192.168.1." start_ip2 #开始ip start_container2 #上同 end_container4 #结束ip 包括 network_name"my_macvlan_network" image_name"dockedahi:…...

npm发布插件到私有仓库保姆级教程

在开发项目的过程中,我们经常需要安装插件依赖,那么怎么把自己开发的组件封装成一个插件,并发布到npm 插件市场或者上传到私有仓库里面呢?今天总结下自己发布插件到私有仓库的记录: 一、创建组件 执行命令创建一个空…...

WinRAR V7.10纯净体验

前言 很多同学在安装了WinRAR之后,每次用这个软件解压文件时,都会先跳出一个广。这个广就像打开了一个新窗口,很打扰人。从WinRAR的5.40版本开始,哪怕是简体中文版的,都会这样弹广告。不管你有没有注册账号&#xff0…...

scss文件内引入其他scss文件报错

1、今天在编译一些老项目的时候,老是提示下面信息 2、而且有很多Sass import rules are deprecated and will be removed in Dart Sass 3.0.0.警告 3、用npm view sass versions看,其中sass的最新版本是1.82.0 4、经过测试"sass": "1.75…...

1-12 GD32基于定时器输入捕获

前言: 基于本人对相关知识回顾与思考,仅供学习参考 目录 前言: 1.0 输入捕获 2.0 信号周期 3.0 定时器配置 4.0 定时器配置 5.0 定时器中断 后记: 1.0 输入捕获 2.0 信号周期 获取信号周期的方法,在第一次捕获与…...

前端基础的讲解-JS(22)

什么是JSON? 1.json 是一种轻量级的数据交换格式 简单来说:json 就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。 类似于: 国际通用语言 - 英语 中国 56 个民族不同地区的通用语言 - 普通话 …...

Minecraft-Datapack数据包开发3-进度与成就

目录 简介成就与进度根进度叶子进度更多的检测方式 简介 代码已经上传: gitee github 成就与进度 工欲善其事必先利其器,别死记硬背,多使用自动生成网站 进度数据包生成器:https://misode.github.io/advancement/指令生成器&…...

泷羽sec-shell编程(3)

shell(3) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…...

如何解决压测过程中JMeter堆内存溢出问题

如何解决压测过程中JMeter堆内存溢出问题 背景一、为什么会堆内存溢出?二、解决堆内存溢出措施三、堆内存参数应该怎么调整?四、堆内存大小配置建议 背景 Windows环境下使用JMeter压测运行一段时间后,JMeter日志窗口报错“java.lang.OutOfMe…...

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…...

uniapp 微信小程序webview 和 h5数据通信

项目是uniapp编写,因为是先开发了h5和app,小程序是突然要用的,做兼容开发已经来不及,由于微信小程序webview载入h5 因为通信必须要特殊限制(网页向小程序 postMessage 时,会在以下特定时机触发并收到消息&a…...

SSM01-MyBatis框架(一文学会MyBatis)

Mybatis框架 一、Mybatis框架简介 1.1 传统JDBC的缺陷 (1)数据库连接创建、释放频繁会造成系统资源浪费 【MyBatis通过在核心配置文件中配置数据路连接池解决此问题】 (2) SQL语句在代码中硬编码(PreparedStatement向占位符传…...

【PlantUML系列】状态图(六)

一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…...

JS中重排和重绘的区别是什么?

在JavaScript中,当DOM(文档对象模型)发生变化时,浏览器需要重新计算和更新渲染树,这个过程通常涉及到重排(reflow)和重绘(repaint)。了解这两者之间的区别对于优化页面性…...

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...