Go使用sqlx操作MySQL完整指南

# Go使用sqlx操作MySQL完整指南## 1. 安装依赖```bash
go get github.com/go-sql-driver/mysql
go get github.com/jmoiron/sqlx

2. 数据库基础操作

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)// 定义全局db对象
var db *sqlx.DB// 用户结构体
type User struct {ID       int    `db:"id"`Username string `db:"username"`Password string `db:"password"`Age      int    `db:"age"`
}// 初始化数据库连接
func initDB() (err error) {// 连接数据库dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True"db, err = sqlx.Connect("mysql", dsn)if err != nil {return err}// 设置连接池参数db.SetMaxOpenConns(100)db.SetMaxIdleConns(10)return nil
}// 创建数据库
func createDatabase() error {_, err := db.Exec("CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8mb4")return err
}// 删除数据库
func dropDatabase() error {_, err := db.Exec("DROP DATABASE IF EXISTS test")return err
}// 创建表
func createTable() error {sql := `CREATE TABLE IF NOT EXISTS users(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(50) NOT NULL,age INT)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`_, err := db.Exec(sql)return err
}// 删除表
func dropTable() error {_, err := db.Exec("DROP TABLE IF EXISTS users")return err
}// 插入单条数据
func insertUser(user User) error {sql := "INSERT INTO users(username, password, age) VALUES (?, ?, ?)"_, err := db.Exec(sql, user.Username, user.Password, user.Age)return err
}// 批量插入数据
func batchInsertUsers(users []User) error {sql := "INSERT INTO users(username, password, age) VALUES (:username, :password, :age)"_, err := db.NamedExec(sql, users)return err
}// 查询单个用户
func getUserByID(id int) (User, error) {var user Usersql := "SELECT * FROM users WHERE id=?"err := db.Get(&user, sql, id)return user, err
}// 查询多个用户
func getUsers(age int) ([]User, error) {var users []Usersql := "SELECT * FROM users WHERE age > ?"err := db.Select(&users, sql, age)return users, err
}// 更新用户
func updateUser(user User) error {sql := "UPDATE users SET password=?, age=? WHERE username=?"_, err := db.Exec(sql, user.Password, user.Age, user.Username)return err
}// 删除用户
func deleteUser(id int) error {sql := "DELETE FROM users WHERE id=?"_, err := db.Exec(sql, id)return err
}func main() {// 初始化数据库连接if err := initDB(); err != nil {fmt.Printf("init db failed, err:%v\n", err)return}defer db.Close()// 创建数据库if err := createDatabase(); err != nil {fmt.Printf("create database failed, err:%v\n", err)return}// 创建表if err := createTable(); err != nil {fmt.Printf("create table failed, err:%v\n", err)return}// 插入单个用户user1 := User{Username: "张三",Password: "123456",Age:      20,}if err := insertUser(user1); err != nil {fmt.Printf("insert user failed, err:%v\n", err)return}// 批量插入用户users := []User{{Username: "李四", Password: "123456", Age: 21},{Username: "王五", Password: "123456", Age: 22},{Username: "赵六", Password: "123456", Age: 23},}if err := batchInsertUsers(users); err != nil {fmt.Printf("batch insert users failed, err:%v\n", err)return}// 查询单个用户user, err := getUserByID(1)if err != nil {fmt.Printf("get user failed, err:%v\n", err)return}fmt.Printf("user:%#v\n", user)// 查询多个用户userList, err := getUsers(20)if err != nil {fmt.Printf("get users failed, err:%v\n", err)return}fmt.Printf("users:%#v\n", userList)// 更新用户user1.Password = "654321"if err := updateUser(user1); err != nil {fmt.Printf("update user failed, err:%v\n", err)return}// 删除用户if err := deleteUser(1); err != nil {fmt.Printf("delete user failed, err:%v\n", err)return}// 删除表if err := dropTable(); err != nil {fmt.Printf("drop table failed, err:%v\n", err)return}// 删除数据库if err := dropDatabase(); err != nil {fmt.Printf("drop database failed, err:%v\n", err)return}
}

3. 事务操作示例

// 使用事务进行转账
func transfer(fromUsername, toUsername string, amount int) error {tx, err := db.Beginx() // 开启事务if err != nil {return err}// 在事务中执行多个SQL操作sql1 := "UPDATE users SET balance = balance - ? WHERE username = ?"sql2 := "UPDATE users SET balance = balance + ? WHERE username = ?"// 执行第一个SQLresult1, err := tx.Exec(sql1, amount, fromUsername)if err != nil {tx.Rollback() // 回滚事务return err}// 检查影响行数rows1, err := result1.RowsAffected()if err != nil {tx.Rollback()return err}if rows1 != 1 {tx.Rollback()return fmt.Errorf("转出账户不存在")}// 执行第二个SQLresult2, err := tx.Exec(sql2, amount, toUsername)if err != nil {tx.Rollback()return err}// 检查影响行数rows2, err := result2.RowsAffected()if err != nil {tx.Rollback()return err}if rows2 != 1 {tx.Rollback()return fmt.Errorf("转入账户不存在")}// 提交事务return tx.Commit()
}

4. 常用查询技巧

4.1 IN查询

func getUsersByIDs(ids []int) ([]User, error) {query, args, err := sqlx.In("SELECT * FROM users WHERE id IN (?)", ids)if err != nil {return nil, err}query = db.Rebind(query)var users []Usererr = db.Select(&users, query, args...)return users, err
}

4.2 分页查询

func getUsersByPage(page, pageSize int) ([]User, error) {offset := (page - 1) * pageSizesql := "SELECT * FROM users LIMIT ? OFFSET ?"var users []Usererr := db.Select(&users, sql, pageSize, offset)return users, err
}

4.3 模糊查询

func searchUsers(keyword string) ([]User, error) {sql := "SELECT * FROM users WHERE username LIKE ?"var users []Usererr := db.Select(&users, sql, "%"+keyword+"%")return users, err
}

5. 注意事项

  1. 始终记得关闭数据库连接
  2. 使用事务时要确保正确处理回滚和提交
  3. 使用预处理语句防止SQL注入
  4. 合理设置连接池参数
  5. 处理所有可能的错误
  6. 使用合适的字段类型和索引优化查询性能

6. 最佳实践

  1. 使用结构体标签映射数据库字段
  2. 统一错误处理
  3. 使用连接池
  4. 合理组织代码结构
  5. 编写单元测试
  6. 记录必要的日志
  7. 定期备份数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492526.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 组件学习记录:Aspect Ratio Fitter

概述 Aspect Ratio Fitter是 Unity 中的一个组件,用于控制 UI 元素(如Image、RawImage等)的宽高比。它在处理不同屏幕分辨率和尺寸时非常有用,可以确保 UI 元素按照预期的比例进行显示。当添加到一个 UI 对象上时,Aspe…

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…

Elasticsearch:什么是信息检索?

信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息(IR)检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式,信息检索是每天使用…

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架 Pytest BDD vs Behave:选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave:关键区别Pytest BDD vs Behave:最佳应用场景结…

【数据集】5种常见人类行为检测数据集3379张YOLO+VOC格式

数据集格式:VOC格式YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:3379 Annotations文件夹中xml文件总计:3379 labels文件夹中txt文件总计:3379 标签种类数&am…

唯品会Android面试题及参考答案

HTTP 和 HTTPS 的区别是什么?你的项目使用的是 HTTP 还是 HTTPS? HTTP 和 HTTPS 主要有以下区别。 首先是安全性。HTTP 是超文本传输协议,数据传输是明文的,这意味着在数据传输过程中,信息很容易被窃取或者篡改。比如,在一个不安全的网络环境下,黑客可以通过网络嗅探工具…

基于Python+Vue开发的商城管理系统,大四期末作业,实习作品

项目简介 该项目是基于PythonVue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的网上商城管…

在 Solana 上实现 SOL 转账及构建支付分配器

与以太坊不同,在以太坊中,钱包通过 msg.value 指定交易的一部分并“推送” ETH 到合约,而 Solana 程序则是从钱包“拉取” Solana。 因此,没有“可支付”函数或“msg.value”这样的概念。 下面我们创建了一个新的 anchor 项目&a…

WebRTC搭建与应用(一)-ICE服务搭建

WebRTC搭建与应用(一) 近期由于项目需要在研究前端WebGL渲染转为云渲染,借此机会对WebRTC、ICE信令协议等有了初步了解,在此记录一下,以防遗忘。 第一章 ICE服务搭建 文章目录 WebRTC搭建与应用(一)前言一、ICE是什么?二、什么…

Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程

12. 多线程编程 注:博客中有书中没有的内容,均是来自 黑马06-线程概念_哔哩哔哩_bilibili 早期Linux不支持线程,直到1996年,Xavier Leroy等人开发出第一个基本符合POSIX标准的线程库LinuxThreads,但LinuxThreads效率…

查看Mysql数据库引擎以及修改引擎为innoDB

目录 打开Mysql命令行 打开Mysql命令行 SHOW ENGINES;innoDB在事务型数据库中应用最多,其主要支持事务安全表(ACID),行锁定和外键。 介绍下InnoDB的主要特性: 1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事…

Moretl安全日志采集工具

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…

nodejs搭配express网站开发后端接口设计需要注意事项

nodejs搭配express网站开发后端接口设计需要注意事项!为了回避一些常见的误区,今天和大家汇总一下,最近我遇到的一些错误信息,虽然都是小问题,但是还是需要分享一下,以免大家再次犯错。 1:第一个…

8_HTML5 SVG (4) --[HTML5 API 学习之旅]

8_HTML5 SVG (4) --[HTML5 API 学习之旅] SVG 文本 HTML5 中的 SVG&#xff08;可缩放矢量图形&#xff09;允许你直接在网页中嵌入图形&#xff0c;并且可以使用 <text> 元素来添加文本到这些图形中。以下是四个带有详细注释的 SVG 文本示例&#xff0c;展示了如何在不…

【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 情况描述 中标麒麟服务器操作系统V7运行在 ARM虚…

谷歌浏览器的界面调整与设置方法

谷歌浏览器是一款广受欢迎的网络浏览器&#xff0c;其简洁的界面和丰富的扩展功能吸引了大量用户。本文将详细介绍如何调整谷歌浏览器的界面以及一些实用的设置方法&#xff0c;帮助你更好地使用这款浏览器。&#xff08;本文由https://chrome.sungyun.cn/的作者进行编写&#…

05、GC基础知识

JVM程序在跑起来之后&#xff0c;在数据的交互过程中&#xff0c;就会有一些数据是过期不用的&#xff0c;这些数据可以看做是垃圾&#xff0c;JVM中&#xff0c;这些垃圾是不用开发者管的&#xff0c;它自己会有一套垃圾回收系统自动回收这些内存垃圾&#xff0c;以备后面继续…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式&#xff0c;其中集成Kafka 0.10是较为简单的&#xff0c;即&#xff1a;Kafka分区和Spark分区之间是1:1的对应关系&#xff0c;以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整&#xff0c;下面我们…