Go 语言 sqlx 库使用:对 MySQL 增删改查
MySQL 作为目前最流行的开源关系型数据库,其 SQL 语法体系已形成行业标准,相关知识体系庞大且成熟,本文不再对 SQL 基础进行详细展开,建议尚未掌握的读者先行系统学习。本文聚焦于如何使用 Go 语言进行 MySQL 数据库操作,旨在为开发者提供实践层面的技术指引。
在实际项目开发中,直接使用数据库驱动进行操作的场景较少,更多开发者会选择采用 ORM(对象关系映射)框架来简化开发流程。本文选用的sqlx
库,作为 Go 标准sql
库的增强版本,虽然不具备完整的 ORM 功能,但凭借简洁高效、轻量灵活的特性,在中小型项目或对性能要求较高的场景中备受青睐。若更倾向于功能完备的 ORM 解决方案,推荐探索Gorm
、Xorm
、Ent
等业界知名的 ORM 框架,它们在自动化映射、复杂查询构建等方面表现出色,能显著提升开发效率。
安装
首先需要安装Go的MySQL驱动:
$ go get github.com/jmoiron/sqlx
sqlx
或者说标准库database/sql
支持的数据库不止 MySQL,任何实现了driver.Driver
接口的类型都支持,比如:
- PostgreSQL
- Oracle
- MariaDB
- SQLite
- 等其他关系数据库
要使用对应的数据库,就需要实现数据库驱动,驱动可以是你自己写的,也可以是第三方库,在使用之前你就要先使用sql.Register
注册驱动,然后才能使用。不过一般下载的驱动库都会自动注册驱动,不需要你来手动注册。
func Register(name string, driver driver.Driver)
由于 MySQL 比较流行,也最为简单,所以本文采用 MySQL 来讲解,其他关系数据库操作起来都是大差不大差的,下载 MySQL 驱动库
$ go get github.com/go-sql-driver/mysql
连接数据库
通过sqlx.Open
函数,就可以打开一个数据库连接,它接受两个参数,第一个是驱动名称,第二个就是数据源(一般简称 DSN)。
func Open(driverName, dataSourceName string) (*DB, error)
驱动名称就是注册驱动时使用的名称,需要保持一致,DSN 就是数据库的连接地址,每种数据库都可能会不一样,对于 MySQL 而言就是下面这样
db, err := sqlx.Open("mysql", "user:pass@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True")
if err != nil {panic(err)
}
defer db.Close()
查询
单条查询
var db *sqlx.DBtype Person struct {UserId string `db:"id"`Username string `db:"name"`Age int `db:"age"`Address string `db:"address"`
}func init() {conn, err := sqlx.Open("mysql", "root:wyh246859@tcp(127.0.0.1:3306)/test")if err != nil {fmt.Println("Open mysql failed", err)return}db = conn
}func main() {query()defer db.Close()
}func query() {var person Person//查询一个是Get,多个是Selecterr := db.Get(&person, "select * from user where id = ?", "12132")if err != nil {fmt.Println("query failed:", err)return}fmt.Printf("query succ:%+v", person)
}func list() {var perons []Personerr := db.Select(&perons, "select * from user")if err != nil {fmt.Println("list err", err)return}fmt.Printf("list succ,%+v", perons)
}
多条查询
var users []User
err := db.Select(&users, "SELECT id, name FROM users WHERE age > ?", 18)
插入
单条插入
func insert() {result, err := db.Exec("insert into user value (?,?,?,?)", "120230", "李四", 12, "广州市")if err != nil {fmt.Println("insert err:", err)return}id, err := result.LastInsertId()if err != nil {fmt.Println("insert err:", err)return}fmt.Println("insert succ:", id)
}
命名参数插入
_, err := db.NamedExec("INSERT INTO users(name, age) VALUES(:name, :age)", map[string]interface{}{"name": "李四", "age": 30})
更新
func update() {res, err := db.Exec("update user set name = ? where id = ?", "赵六", "120230")if err != nil {fmt.Println("update err:", err)return}eff, err := res.RowsAffected()if err != nil || eff == 0 {fmt.Println("update err:", err)return}fmt.Println("Update succ")
}
删除
func delete() {res, err := db.Exec("delete from user where id = ?", "120230")if err != nil {fmt.Println("delete err:", err)return}eff, err := res.RowsAffected()if err != nil || eff == 0 {fmt.Println("delete err:", err)return}fmt.Println("delete succ")
}
事务处理
func (db *DB) Begin() (*Tx, error) // 开始一个事务
func (tx *Tx) Commit() error // 提交一个事务
func (tx *Tx) Rollback() error // 回滚一个事务
当开启一个事务后,为了保险都会加一句defer tx.Rollback()
,如果如果过程出错了,就会回滚,要是事务成功提交了,这个回滚自然是无效的。
func main() {transation, err := db.Begin()if err != nil {fmt.Println("transation err")}defer transation.Rollback()insert()query()update()query()delete()transation.Commit()
}
参考资料:
Golang 中文学习文档 - 数据库 - MySQL
相关文章:
Go 语言 sqlx 库使用:对 MySQL 增删改查
MySQL 作为目前最流行的开源关系型数据库,其 SQL 语法体系已形成行业标准,相关知识体系庞大且成熟,本文不再对 SQL 基础进行详细展开,建议尚未掌握的读者先行系统学习。本文聚焦于如何使用 Go 语言进行 MySQL 数据库操作ÿ…...
反射, 注解, 动态代理
文章目录 单元测试什么是单元测试咱们之前是如何进行单元测试的? 有啥问题 ?现在使用方法进行测试优点Junit单元测试的使用步骤删除不需要的jar包总结 反射认识反射、获取类什么是反射反射具体学什么?反射第一步:或者Class对象 获…...
继续预训练 LLM ——数据筛选的思路
GPT生成数据微调qwen-2.5多模态模型实战项目 作者:柠檬养乐多 原文地址:https://zhuanlan.zhihu.com/p/30645776656 qwen2.5-vl是阿里通义实验室推出的qwen系列最新多模态大模型,在许多指标上已经超过或接近了gpt-4o。更为方便的是࿰…...
深入解析 PostgreSQL 外部数据封装器(FDW)的 SELECT 查询执行机制
引言 PostgreSQL 中的外部数据封装器(Foreign Data Wrapper, FDW)是一种扩展,允许您像访问 PostgreSQL 数据库中的表一样,访问和操作存储在外部数据源中的数据。FDW 使 PostgreSQL 能够与多种数据存储系统(包括关系型…...
数据库系统概论|第六章:关系数据理论—课程笔记2
前言 前文我们介绍了规划化的基本概念,同时引入了关于规范化的相关定义与基本概念,低一级范式的关系模式,通过模式分解,可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。本文将围绕范式展开讨论&…...
package-lock.json能否直接删除?
package-lock.json能否直接删除? package-lock.json 生成工具:由 npm 自动生成。 触发条件:当运行 npm install 时,如果不存在 package-lock.json,npm 会创建它;如果已存在,npm 会根据它精确安…...
Ubuntu磁盘空间分析:du命令及常用组合
1、du命令的作用 du(Disk Usage)是 Ubuntu 系统中用于查看目录或文件磁盘使用情况的命令,主要用于分析磁盘空间占用。 2、语法 du [选项] [目录/文件路径]常用选项 2.1、-h 以 KB、MB、GB 等人性化可读格式(Human-readable&am…...
《数据库原理》部分习题解析1
《数据库原理》部分习题解析1 1. 名词解释 (1)关系(2)属性(3)域(4)元组(5)码(6)分量(7)关系模式 ࿰…...
汇川Easy系列PLC数据值改变功能块(随动增益改变判断)
PLC值改变事件 值改变触发功能块 PLC值改变事件 值改变触发功能块(SCL ST完整源代码)-CSDN博客文章浏览阅读1.1k次。本文介绍了在PLC中处理值改变事件的方法,包括值改变触发功能块的实现,详细讲解了FB接口定义、ST代码,并提供了在博途平台上的实现。此外,还分享了如何利用…...
数据清洗的艺术:如何为AI模型准备高质量数据集?
数据清洗的艺术:如何为AI模型准备高质量数据集? 引言 在人工智能和机器学习领域,我们常常听到"垃圾进,垃圾出"(Garbage in, garbage out)这句格言。无论你的模型架构多么精妙,算法多么先进,如果…...
怎么查看当前vue项目,要求的node.js版本
怎么查看当前vue项目,要求的node.js版本 找到 package.json package-lock.json 搜索 node...
游戏引擎学习第278天:将实体存储移入世界区块
总结并为今天的内容做好铺垫 今天的内容是关于开发一个完整的实体系统,目标是让这个系统更加实际和有效。之前讨论了如何通过一个模拟区域来处理无限大的世界。最初,使用浮动点数而不是双精度浮点数来避免潜在的精度问题,因为一些平台&#…...
计算机组成与体系结构:缓存设计概述(Cache Design Overview)
目录 Block Placement(块放置) Block Identification(块识别) Block Replacement(块替换) Write Strategy(写策略) 总结: 高速缓存设计包括四个基础核心概念…...
在Linux中如何使用Kill(),向进程发送发送信号
kill()函数 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 函数参数和返回值含义如下: pid:参数 pid 为正数的情况下,用于指定接收此信号的进程 pid;除此之外,参数 pid 也可设置为 0 或-1 以及小于-1 等不同值,稍后给说明。 …...
ElasticSearch重启之后shard未分配问题的解决
以下是Elasticsearch重启后分片未分配问题的完整解决方案,结合典型故障场景与最新实践: 一、快速诊断定位 检查集群状态 GET /_cluster/health?pretty # status为red/yellow时需关注unassigned_shards字段值 2.查看未分配分片详情 …...
基于 Spring Boot 瑞吉外卖系统开发(十四)
基于 Spring Boot 瑞吉外卖系统开发(十四) 查询订单 在管理端的首页,单击左侧菜单栏中的“订单明细”,会在右侧打开订单明细页面。 请求路径:/order/page 请求方法:GET 参数:page pageSize …...
【软件测试】第二章·软件测试的基本概念
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏:🏀软件测试与软件项目管理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …...
部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
目录 编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…...
2025五一杭州西湖三天游
2025五一杭州西湖三天游 文章目录 2025五一杭州西湖三天游一、前言二、杭州游玩记录三、杭州三日游小结四、杭州美食街1、河坊街2、胜利河美食街3、高银街4、中山南路美食街5、武林夜市6、啦喜街美食广场7、大兜路美食街 五、豆包推荐的杭州三日游攻略三天主要行程**第一天&…...
实验五:以太网UDP全协议栈的实现(通过远程实验系统)
文章目录 FPGA以太网:从ARP到UDP的完整协议栈一、引言二、核心模块详解1. ARP协议处理模块1.1 `arp_cache`:ARP缓存模块1.2 `arp_tx`:ARP请求与应答发送模块1.3 `arp_rx`:ARP接收与解析模块2. MAC层处理模块2.1 `mac_layer`:MAC层顶层模块2.2 `mac_tx_mode`:MAC发送模式选…...
现代计算机图形学Games101入门笔记(八)
三角形三点已经知道在uv的位置了,那三角形内部的点,怎么算。 先看A 任一点 面积比求 根据三点坐标属性差值出内部点的位置。 纹理太小了,映射处理方式,取邻近的Nearest感觉一格格的,取周围4个权重Bilinear,取4*4Bicubi…...
C语言学习之文件操作
经过前面的学习,我们已经基本掌握了如何去写一个C语言的代码了。但是在实际的项目中,我们不可能不需要文件去操作。因为如果没有文件,我们写的程序是存储在电脑的内存中的。如果程序推出,内存回收数据就随之丢失了。如果我们要对数…...
《AI大模型应知应会100篇》第63篇:AutoGPT 与 BabyAGI:自主代理框架探索
第63篇:AutoGPT 与 BabyAGI:自主代理框架探索 摘要 随着大语言模型(LLM)技术的不断演进,自主代理(Autonomous Agent) 正在成为 AI 应用的新范式。它不仅能够理解用户意图,还能自主规…...
使用大模型预测急性结石性疾病技术方案
目录 1. 数据预处理与特征工程伪代码 - 数据清洗与特征处理数据预处理流程图2. 大模型构建与训练伪代码 - 模型训练模型训练流程图3. 术前预测系统伪代码 - 术前风险评估术前预测流程图4. 术中实时调整系统伪代码 - 术中风险预警术中调整流程图5. 术后护理系统伪代码 - 并发症预…...
基于运动补偿的前景检测算法
这段代码实现了基于运动补偿的前景检测算法。 主要功能包括: 运动补偿模块:使用基于网格的 KLT 特征跟踪算法计算两帧之间的运动,然后通过单应性变换实现帧间运动补偿。前景检测模块:结合两帧运动补偿结果,通过帧间差…...
鸿蒙OSUniApp开发富文本编辑器组件#三方框架 #Uniapp
使用UniApp开发富文本编辑器组件 富文本编辑在各类应用中非常常见,无论是内容创作平台还是社交软件,都需要提供良好的富文本编辑体验。本文记录了我使用UniApp开发一个跨平台富文本编辑器组件的过程,希望对有类似需求的开发者有所启发。 背景…...
W5500使用SocketTool工具测试
W5500使用SocketTool工具测试 1、按“WINR” 2、输入“IPCONFIG”,得到计算机的IP地址,子网掩码和网关 3、设置W5500设备网络参数如下: 本地网关:192.168.1.1 本地子网掩码: 255.255.255.0 本地物理地址:0C 2…...
《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、命名实体识别(NER)基础1. 什么是命名实体识别&#…...
双向长短期记忆网络-BiLSTM
5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM)是一种扩展自长短期记忆网络(LSTM)的结构,旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…...
CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
一、环境 二、命令及含义 fdisk fdisk是一个较老的分区表创建和管理工具,主要支持MBR(Master Boot Record)格式的分区表。MBR分区表支持的硬盘单个分区最大容量为2TB,最多可以有4个主分区。fdisk通过命令行界面进行操…...
如何在终端/命令行中把PDF的每一页转换成图片(PNG)
今天被对象安排了一个任务: 之前自己其实也有这个需要,但是吧,我懒:量少拖拽,量大就放弃。但这次躲不过去了,所以研究了一下有什么工具可以做到这个需求。 本文记录我这次发现的使用 XpdfReader 的方法。…...
【0415】Postgres内核 释放指定 memory context 中所有内存 ④
1. frees all memory (memory context) Postgres内核中由函数 AllocSetReset() 完成该功能。即 “释放给定set中分配的所有内存。” 它应当将所有已分配的chunks标记为已释放,但不一定需要归还set所拥有的全部资源。我们的实际实现是,除了“保留”块(“keeper” block)(…...
2025年Flutter初级工程师技能要求
在2025年,随着移动应用市场的持续增长和跨平台开发需求的不断增加,Flutter已经成为许多公司构建高性能、跨平台应用的首选框架。对于初入职场的Flutter初级工程师来说,掌握以下技能要求是必不可少的。这些技能不仅能够帮助你在工作中快速上手…...
AWS技术助力企业满足GDPR合规要求
GDPR(通用数据保护条例)作为欧盟严格的数据保护法规,给许多企业带来了合规挑战。本文将探讨如何利用AWS(亚马逊云服务)的相关技术来满足GDPR的核心要求,帮助企业实现数据保护合规。 一、GDPR核心要求概览 GDPR的主要目标是保护欧盟公民的个人数据和隐私权。其核心要求包括: 数…...
MVCC:数据库并发控制的利器
在并发环境下,数据库需要处理多个事务同时访问和修改数据的情况。为了保证数据的一致性和隔离性,数据库需要采用一些并发控制机制。MVCC (Multi-Version Concurrency Control,多版本并发控制) 就是一种常用的并发控制技术,它通过维…...
第二章、Isaaclab强化学习包装器(3):SKRL Wrapper
0 前言 官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab_rl/isaaclab_rl.html#module-isaaclab_rl.skrl https://skrl.readthedocs.io/en/latest/intro/getting_started.html 在本节中,您将学习如何使用 skrl 库的各种组件来创建强…...
AI数字人实现原理
随着人工智能与数字技术的快速发展,AI数字人(Digital Human)作为新一代人机交互媒介,正在多个行业中快速落地。无论是在虚拟主播、在线客服、教育培训,还是在数字代言、元宇宙中,AI数字人都扮演着越来越重要…...
RBTree的模拟实现
1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…...
ssh connect to remote gitlab without authority
ssh connect to remote gitlab without authority 1 this command can produce a ssh key for authority ssh-keygen -t ed25519 -C "your_emailexample.com"2 this command can get the comment about the key cat ~/.ssh/id_ed25519.pubcopy all content !!!...
gitlab提交测试分支的命令和流程
写在前面 先npm run lint:eslint 先走一遍代码校验然后再提交先把检验跑了再add commit push那些注意一下这个问题:git commit规范不对导致报错subject may not be empty[subject-empty]type may not be empty[type-empty]. 配置lint检查后, 使用commitlint之后报…...
序列化和反序列化hadoop实现
### Hadoop 中序列化与反序列化的实现机制 Hadoop 提供了自己的轻量级序列化接口 Writable,用于高效地在网络中传输数据或将其存储到磁盘。以下是关于其核心概念和实现方式的详细介绍: --- #### 1. **Hadoop 序列化的核心原理** Hadoop 的序列化是一…...
[操作系统] 策略模式进行日志模块设计
文章目录 [toc]一、什么是设计模式?二、日志系统的基本构成三、策略模式在日志系统中的落地实现✦ 1. 策略基类 LogStrategy✦ 2. 具体策略类▸ 控制台输出:ConsoleLogStrategy▸ 文件输出:FileLogStrategy 四、日志等级枚举与转换函数五、日…...
LeetCode 每日一题 3341. 到达最后一个房间的最少时间 I + II
3341. 到达最后一个房间的最少时间 I II 有一个地窖,地窖中有 n x m 个房间,它们呈网格状排布。 给你一个大小为 n x m 的二维数组 moveTime ,其中 moveTime[i][j] 表示在这个时刻 以后 你才可以 开始 往这个房间 移动 。你在时刻 t 0 时从…...
《Python星球日记》 第68天:BERT 与预训练模型
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、BERT模型基础1. 什么是BERT?2. BERT 的结构3.预训练和微调对比二、BERT 的预训练任务1. 掩码语言模型 (MLM)2. 下一句预测 (NSP)三、微调 …...
Angular 知识框架
一、Angular 基础 1. Angular 简介 Angular 是什么? 基于 TypeScript 的前端框架(Google 维护)。 适用于构建单页应用(SPA)。 核心特性 组件化架构 双向数据绑定 依赖注入(DI) 模块化设计…...
python三方库sqlalchemy
SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM(对象关系映射)库,它允许你使用 Python 对象来操作数据库,而不需要直接编写 SQL 语句。同时,它也提供了对底层 SQL 的完全控制能力,适用于从简单脚本到大型企…...
【SSL部署与优化】如何为网站启用HTTPS:从Let‘s Encrypt免费证书到Nginx配置
网站启用HTTPS 的完整实战指南,涵盖从 Let’s Encrypt 免费证书申请到 Nginx 配置的详细步骤,包括重定向、HSTS 设置及常见问题排查: 一、准备工作 1. 确保域名解析正确 • 在 DNS 管理后台,将域名(如 example.com&…...
Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
电商平台自动化
为什么要进行独立站自动化 纯人工测试人力成本高,相对效率低 回归测试在通用模块重复进行人工测试,测试效率低 前期调研备选自动化框架(工具): Katalon Applitools Testim 阿里云EMAS Playwright Appium Cypress 相关…...
【kafka】kafka概念,使用技巧go示例
1. Kafka基础概念 1.1 什么是Kafka? Kafka是一个分布式流处理平台,用于构建实时数据管道和流式应用。核心特点: 高吞吐量:每秒可处理百万级消息持久化存储:消息按Topic分区存储在磁盘分布式架构:支持水平…...