GO框架基础 (二)、sqlx库

2024-02-20 07:52
文章标签 基础 go 框架 sqlx

本文主要是介绍GO框架基础 (二)、sqlx库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Go 语言中,sqlx 包是一个用于数据库操作的库,它建立在标准库的 database/sql 包之上,并提供了一些额外的功能,以简化和增强与数据库的交互。sqlx 的目标是通过提供更方便的 API 和一些附加功能来改善在 Go 中进行 SQL 数据库查询的体验。

以下是 sqlx 包的一些主要特性:

  1. 结构体映射: sqlx 允许将数据库查询的结果映射到 Go 结构体中,简化了数据的处理和访问。

  2. 命名参数: 支持使用命名参数执行查询,使得 SQL 语句更易读且更易维护。

  3. Null 值支持: 对于可能为 NULL 的字段,sqlx 提供了 null 类型,以方便地处理这些情况。

  4. 更丰富的查询方法: sqlx 提供了一些额外的查询方法,如 GetSelect,使得执行查询更加方便。

  5. 数据库连接池: 支持数据库连接池,提高了在并发环境中的性能。

  6. 支持多种数据库: sqlx 可以与多种数据库一起使用,包括 PostgreSQL、MySQL、SQLite 等。

  7. 原生 SQL 支持: sqlx 支持使用原生的 SQL 语句,同时也支持使用预处理语句。

  8. 扫描任意类型: sqlx 具有更灵活的 Scan 方法,可以直接将查询结果映射到任意类型。

总体而言,sqlx 提供了一些额外的工具和功能,使得在 Go 语言中进行数据库查询更加方便、灵活,同时也提高了代码的可读性和可维护性。如果你在 Go 中进行 SQL 数据库操作,sqlx 是一个值得考虑的库。

接下来我们已MySQL为例,通过go代码实现数据库的CRUD

1. 安装数据库相关包

 	go get "github.com/jmoiron/sqlx"go get "github.com/go-sql-driver/mysql"

2.连接数据库

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)// 准备数据库的连接参数信息
var (userName  string = "root"passWord  string = "12345678"ipAddress string = "127.0.0.1"port      string = "3306"dbName    string = "go_test"charset   string = "utf8mb4"
)// 链接mysql
func connectSql() *sqlx.DB {//root:12345678@tcp(127.0.0.1:3306)/go_test?charset=utf8mb4dbStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", userName,passWord,ipAddress,port,dbName,charset)//使用匿名变量忽略errDB, _ := sqlx.Open("mysql", dbStr)//数据库连接池优化//DB.SetConnMaxLifetime() 设置连接的最大生存时间为5分钟//DB.SetConnMaxIdleTime() 设置连接的最大空闲时间为10分钟// 设置连接池大小//db.SetMaxOpenConns(10) // 设置最大打开连接数//db.SetMaxIdleConns(5)  // 设置最大空闲连接数ping(DB)return DB
}// 测试连接 调用DB对象的原始函数 ping()
func ping(db *sqlx.DB) {err := db.Ping()if err != nil {fmt.Println("ping失败", err)} else {fmt.Println("ping成功")}
}func main() {mysqlDB := connectSql()defer mysqlDB.Close()
}

3.数据库连接成功后,使用sqlx相关语法实现对数据库的增删改查(CRUD)

先在本地创建一个测试用的数据库表

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`userid` int(11) NULL DEFAULT NULL COMMENT '用户id',`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户密码',`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户头像',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  • 使用Exec()实现数据的增删改
func main() {mysqlDB := connectSql()defer mysqlDB.Close()//新增insertSql := "insert into user(userid,username,password,avatar,create_time,update_time) values (?,?,?,?,?,?)"result, err := mysqlDB.Exec(insertSql, 1, "xiaoming", "12345678", "a.png", time.Now().Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05"))if err != nil {fmt.Println("数据插入失败", err)return}//查询新增后的最新的idid, _ := result.LastInsertId()fmt.Println(id)//修改updateSql := "update  user set username = 'hahaha' where id =1"result2, err2 := mysqlDB.Exec(updateSql)if err2 != nil {fmt.Println("数据更新失败", err2)return}num, _ := result2.RowsAffected()fmt.Println("影响的数据行数", num)//删除deleteSql := "delete from user where id =1"result3, _ := mysqlDB.Exec(deleteSql)num2, _ := result3.RowsAffected()fmt.Println("影响的数据行数", num2)
}
  • 使用Query、Get、Select实现数据的查询
	mysqlDB := connectSql()defer mysqlDB.Close()//基础类型存储querySql := "select * from user"rows, _ := mysqlDB.Query(querySql)for rows.Next() {var id, userId intvar username, password, avatar, create_time, update_time stringrows.Scan(&id, &userId, &username, &password, &avatar, &create_time, &update_time)fmt.Println(id, userId, username, password, avatar, create_time, update_time)}rows.Close()fmt.Println(rows)//利用结构体、切片存储数据//需要与数据库内的所有字段一一映射,不一致会导致查询后的解析失败type user struct {Id         int    `db:"id"`UserId     int    `db:"userid"`UserName   string `db:"username"`Password   string `db:"password"`Avatar     string `db:"avatar"`CreateTime string `db:"create_time"`UpdateTime string `db:"update_time"`}//查询单条userData := new(user)mysqlDB.Get(userData, "select * from user where id =2")fmt.Println(userData)//查询所有var userSlice []user//需要传入切片地址err := mysqlDB.Select(&userSlice, "select * from user")if err != nil {fmt.Println(err)}fmt.Println(userSlice)

这篇关于GO框架基础 (二)、sqlx库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727508

相关文章

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se