go使用mysql实现增删改查操作
1、安装MySQL驱动
go get -u github.com/go-sql-driver/mysql
2、go连接MySQL
import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动
)type Users struct {ID intName stringEmail string
}var db *sql.DBfunc init() {// 连接MySQL数据库var err errordb, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true")if err != nil {log.Fatal(err)}// 测试连接if err = db.Ping(); err != nil {log.Fatal(err)}// 创建用户表createTableSQL := `CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name varchar(64) NOT NULL,email varchar(64) NOT NULL UNIQUE);`// 执行 SQL 语句_, err = db.Exec(createTableSQL)if err != nil {log.Fatal(err)}
}
3、users表增删改查SQL
// CreateUser 创建新用户
func (u *Users) CreateUser() (int64, error) {stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")if err != nil {return 0, err}res, err := stmt.Exec(u.Name, u.Email)if err != nil {return 0, err}return res.LastInsertId()
}// GetUserByID 根据 ID 获取用户
func (u *Users) GetUserByID(id int) error {row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)return row.Scan(&u.ID, &u.Name, &u.Email)
}// GetAllUsers 获取所有用户
func GetAllUsers() ([]*Users, error) {rows, err := db.Query("SELECT id, name, email FROM users")if err != nil {return nil, err}defer rows.Close()var users []*Usersfor rows.Next() {user := &Users{}if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {return nil, err}users = append(users, user)}if err := rows.Err(); err != nil {return nil, err}return users, nil
}// UpdateUser 更新用户信息
func (u *Users) UpdateUser() (int64, error) {stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")if err != nil {return 0, err}res, err := stmt.Exec(u.Name, u.Email, u.ID)if err != nil {return 0, err}return res.RowsAffected()
}// DeleteUser 删除用户
func (u *Users) DeleteUser() (int64, error) {stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")if err != nil {return 0, err}res, err := stmt.Exec(u.ID)if err != nil {return 0, err}return res.RowsAffected()
}
4、操作增删改查操作
// 创建用户
user := &Users{Name: "buddha", Email: "3539949705@qq.com"}
id, err := user.CreateUser()
if err != nil {log.Fatalf("Failed to create user: %v", err)
}
fmt.Printf("Created user with ID: %d\n", id)// 获取用户
user = &Users{}
if err := user.GetUserByID(int(id)); err != nil {log.Fatalf("Failed to get user: %v", err)
}
fmt.Printf("User: ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)// 更新用户
user.Name = "buddha2080"
user.Email = "3539949704@qq.com"
affectedRows, err := user.UpdateUser()
if err != nil {log.Fatalf("Failed to update user: %v", err)
}
fmt.Printf("Updated %d rows\n", affectedRows)// 获取所有用户
users, err := GetAllUsers()
if err != nil {log.Fatalf("Failed to get all users: %v", err)
}
for _, u := range users {fmt.Printf("User: id: %d, name: %s, email: %s\n", u.ID, u.Name, u.Email)
}// 删除用户
affectedRows, err = user.DeleteUser()
if err != nil {log.Fatalf("Failed to delete user: %v", err)
}
fmt.Printf("Deleted %d rows\n", affectedRows)
整体测试代码如下:
// main.go
package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动
)type Users struct {ID intName stringEmail string
}var db *sql.DBfunc init() {// 打开或创建一个 SQLite 数据库文件var err errordb, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true")if err != nil {log.Fatal(err)}// 测试连接if err = db.Ping(); err != nil {log.Fatal(err)}// 创建用户表createTableSQL := `CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name varchar(64) NOT NULL,email varchar(64) NOT NULL UNIQUE);`// 执行 SQL 语句_, err = db.Exec(createTableSQL)if err != nil {log.Fatal(err)}
}// CreateUser 创建新用户
func (u *Users) CreateUser() (int64, error) {stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")if err != nil {return 0, err}res, err := stmt.Exec(u.Name, u.Email)if err != nil {return 0, err}return res.LastInsertId()
}// GetUserByID 根据 ID 获取用户
func (u *Users) GetUserByID(id int) error {row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)return row.Scan(&u.ID, &u.Name, &u.Email)
}// GetAllUsers 获取所有用户
func GetAllUsers() ([]*Users, error) {rows, err := db.Query("SELECT id, name, email FROM users")if err != nil {return nil, err}defer rows.Close()var users []*Usersfor rows.Next() {user := &Users{}if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {return nil, err}users = append(users, user)}if err := rows.Err(); err != nil {return nil, err}return users, nil
}// UpdateUser 更新用户信息
func (u *Users) UpdateUser() (int64, error) {stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")if err != nil {return 0, err}res, err := stmt.Exec(u.Name, u.Email, u.ID)if err != nil {return 0, err}return res.RowsAffected()
}// DeleteUser 删除用户
func (u *Users) DeleteUser() (int64, error) {stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")if err != nil {return 0, err}res, err := stmt.Exec(u.ID)if err != nil {return 0, err}return res.RowsAffected()
}func main() {fmt.Println("main函数开始...")// 创建用户user := &Users{Name: "buddha", Email: "3539949705@qq.com"}id, err := user.CreateUser()if err != nil {log.Fatalf("Failed to create user: %v", err)}fmt.Printf("Created user with ID: %d\n", id)// 获取用户user = &Users{}if err := user.GetUserByID(int(id)); err != nil {log.Fatalf("Failed to get user: %v", err)}fmt.Printf("User: ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)// 更新用户user.Name = "buddha2080"user.Email = "3539949704@qq.com"affectedRows, err := user.UpdateUser()if err != nil {log.Fatalf("Failed to update user: %v", err)}fmt.Printf("Updated %d rows\n", affectedRows)// 获取所有用户users, err := GetAllUsers()if err != nil {log.Fatalf("Failed to get all users: %v", err)}for _, u := range users {fmt.Printf("User: id: %d, name: %s, email: %s\n", u.ID, u.Name, u.Email)}// 删除用户affectedRows, err = user.DeleteUser()if err != nil {log.Fatalf("Failed to delete user: %v", err)}fmt.Printf("Deleted %d rows\n", affectedRows)fmt.Println("main函数结束...")
}

相关文章:
go使用mysql实现增删改查操作
1、安装MySQL驱动 go get -u github.com/go-sql-driver/mysql2、go连接MySQL import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动 )type Users struct {ID intName stringEmail string }var db *sql.DBfu…...
【Rust】unsafe rust入门
这篇文章简单介绍下unsafe rust的几个要点 1. 解引用裸指针 裸指针其实就是C或者说C的指针,与C的指针不同的是,Rust的裸指针还是要分为可变和不可变,*const T 和 *mut T: 基于引用创建裸指针 let mut num 5;let r1 &num …...
dpwwn02靶场
靶机下载地址:https://download.vulnhub.com/dpwwn/dpwwn-02.zip 信息收集 ip add 查看kali Linux虚拟机的IP为:10.10.10.128 https://vulnhub.com/entry/dpwwn-2,343/中查看靶机的信息,IP固定为10.10.10.10 所以kali Linux添加仅主机网卡…...
K8S疑难概念理解——Pod,应该以哪种Kind来部署应用,为什么不直接Pod这种kind?
文章目录 一、Pod概念深度理解,为什么一般不直接以kindPod资源类型来部署应用?二、究竟应该以哪种资源类型来部署应用 一、Pod概念深度理解,为什么一般不直接以kindPod资源类型来部署应用? Pod是Kubernetes中的最小部署单元,可以包含一个或…...
LabVIEW进行仪器串行通信与模拟信号采集的比较
在现代测试、测量和控制系统中,设备通常采用两种主要方式与计算机进行交互:一种是通过数字通信接口(如RS-232、RS-485、GPIB等),另一种是通过模拟信号(电压、电流)进行数据输出。每种方式具有其…...
D81【 python 接口自动化学习】- python基础之HTTP
day81 requests请求session用法 学习日期:20241127 学习目标:http定义及实战 -- requests请求session用法 学习笔记: requests请求session用法 import requests# 创建一个会话 reqrequests.session() url "http://sellshop.5istud…...
白鹿 Hands-on:消除冷启动——基于 Amazon Lambda SnapStart 轻松打造 Serverless Web 应用(二)
文章目录 前言一、前文回顾二、在 Lambda 上运行2.1、查看 Amazon SAM template2.2、编译和部署到 Amazon Lambda2.3、功能测试与验证 三、对比 Snapstart 效果四、资源清理五、实验总结总结 前言 在这个环节中,我们将延续《白鹿 Hands-on:消除冷启动——…...
ROC曲线
文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…...
c++ 位图和布隆过滤器
位图(bitmap) 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态,通常用于快速判断某个值是否存在,或者用来表示布尔类型的集合。 特点 节省空间:一个字节可以表示8个状态。高效操作:位操作…...
阿里云CPU过载的一点思考
现象:阿里云ECS服务器连续5个周期CPU超90%告警 分析: max_connections和max_user_connections都做了限制,但是依然告警,服务器上有四个子服务,查看了每个服务的配置文件,发现使用同一个数据库账号&#x…...
单片机学习笔记 15. 串口通信(理论)
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
第六章 二叉树part08 今日内容: ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的…...
Linux history 命令详解
简介 history 命令显示当前 shell 会话中以前执行过的命令列表。这对于无需重新输入命令即可重新调用或重新执行命令特别有用。 示例用法 显示命令历史列表 history# 示例输出如下:1 ls -l 2 cd /var/log 3 cat syslog执行历史记录中的命令 !<number>…...
Kafka知识体系
一、认识Kafka 1. kafka适用场景 消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统:kafka把消息持久化到磁盘上,…...
【Android】EventBus的使用及源码分析
文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…...
【大数据学习 | Spark调优篇】Spark之内存调优
1. 内存的花费 1)每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实…...
Linux:文件系统inode
早期,存储文件的设备是磁盘(当下的市场几乎都是SSD),但大家习惯的把它们都称为磁盘,磁盘是用来表示区分内存的存储设备。而在操作系统看来,这个存储设备的结构就是一个线性结构,这一点很重要。 …...
力扣难题解析
滑动窗口问题 76.最小覆盖子串 题目链接:76. 最小覆盖子串 - 力扣(LeetCode) 题目描述: 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空…...
4.5-Channel 和 Flow:SharedFlow 和 StateFlow
文章目录 SharedFlow数据流的收集和事件订阅的区别launchIn() 和 shareIn() 的区别SharedFlow 与 Flow、Channel 的区别shareIn() 适用场景 shareIn() 的具体参数说明shareIn() 的 replay 参数shareIn() 的 started 参数WhileSubscribed() 的参数及适用场景 MutableSharedFlow、…...
Qt | TCP服务器实现QTcpServer,使用线程管理客户端套接字
点击上方"蓝字"关注我们 01、QTcpServer >>> QTcpServer 是 Qt 网络模块中的一个类,用于实现TCP服务器。它允许创建一个服务器,可以接受来自客户端的连接。QTcpServer 是事件驱动的,这意味着它将通过信号和槽机制处理网络事件。 常用函数 构造函数: QT…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
