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…...
Imatest SFR模块实战:从ISO 12233测试卡到MTF指标解析
1. Imatest SFR模块入门指南 第一次接触Imatest SFR模块时,我完全被各种专业术语搞懵了。后来在实际项目中反复使用才发现,这其实就是个"相机体检仪"——通过分析ISO 12233测试卡上的斜边,就能给相机镜头做个全面体检。想象一下医生…...
机械臂robotic-arm--8.snapshot.7
机械臂作为自动化领域的核心设备,其设计精度与功能稳定性直接影响任务执行效率。以robotic-arm--8.snapshot.7为例,其核心作用体现在多维度空间定位与复杂轨迹规划能力上。通过集成高精度伺服电机与闭环控制系统,该型号机械臂可实现亚毫米级重…...
光场相机入门:Macro Pixel与SAI如何让你的照片秒变3D(附Python代码示例)
光场相机实战指南:用Macro Pixel与SAI技术打造沉浸式3D影像 当你第一次看到光场相机拍摄的照片能在屏幕上自由切换焦点时,那种震撼感就像发现了摄影的新维度。这背后是Macro Pixel和SAI两项核心技术的完美配合——它们让静态图像拥有了动态的视角选择能力…...
基于CYBER-VISION零号协议构建智能技术文档翻译与摘要系统
基于CYBER-VISION零号协议构建智能技术文档翻译与摘要系统 1. 引言 对于很多开发者来说,阅读英文技术文档是件挺头疼的事。尤其是遇到一些前沿的开源项目,官方文档全是英文,里面还夹杂着大量的专业术语和复杂的配置说明。有时候,…...
OpenClaw 小龙虾Windows10 专属一键部署教程|10 分钟搞定本地 AI 数字员工
适配系统:Windows10 64 位(纯小白友好版) 核心优势:免命令行、免环境配置、解压即装,内置所有运行依赖,全程可视化操作,新手也能一次成功部署 2026 爆火的开源 AI 智能体! 本文专属…...
别再手动建节点了!用Python+py2neo批量导入三元组到Neo4j的实战避坑指南
Pythonpy2neo批量导入三元组到Neo4j的工程化实践 当数据规模从几十条扩展到数十万条时,单条插入操作就像用滴管给游泳池注水。去年我们团队处理某知识图谱项目时,就曾因不当的批量导入策略,导致原本2小时能完成的任务跑了整整一天。本文将分享…...
零基础玩转OpenClaw:借助GLM-4.7-Flash实现首个自动化脚本
零基础玩转OpenClaw:借助GLM-4.7-Flash实现首个自动化脚本 1. 为什么选择OpenClaw作为个人自动化助手 去年夏天,当我第三次因为忘记定时发送周报而被领导提醒时,终于下定决心寻找一个能24小时待命的数字助手。在尝试了各种RPA工具后&#x…...
html+css+js创意小游戏~记忆卡片配对(附源码)
1. 从零开始打造记忆卡片配对游戏 最近在教家里小朋友认动物,突然想到可以用前端三件套做个记忆卡片小游戏。这个项目特别适合刚学完HTML/CSS基础,想练手JavaScript的朋友。我自己第一次写这个游戏时,只用了不到100行代码就实现了核心功能&am…...
低成本搭建OpenClaw智能体:星图Qwen3-VL:30B镜像+飞书实战
低成本搭建OpenClaw智能体:星图Qwen3-VL:30B镜像飞书实战 1. 为什么选择本地部署OpenClaw 去年夏天,我接手了一个内容运营的兼职项目,需要每天从几十个信息源收集素材、整理成报告。最初尝试用ChatGPT Plus的API自动化处理,但两…...
Web.py部署环境配置终极指南:Nginx、Gunicorn与Docker容器化全解析
Web.py部署环境配置终极指南:Nginx、Gunicorn与Docker容器化全解析 【免费下载链接】webpy web.py is a web framework for python that is as simple as it is powerful. 项目地址: https://gitcode.com/gh_mirrors/we/webpy Web.py是一款简洁而强大的Pyth…...
