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…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)
13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...