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)

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

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

相关文章

文献速递:GAN医学影像合成--联邦生成对抗网络基础医学图像合成中的后门攻击与防御

文献速递:GAN医学影像合成–联邦生成对抗网络基础医学图像合成中的后门攻击与防御 01 文献速递介绍 虽然深度学习在医疗保健研究中产生了显著影响,但其在医疗保健领域的影响无疑比在其他应用领域更慢、更有限。造成这种情况的一个重要原因是&#xff…

码蹄集新手村MT1241-总结

这道题可以通过手写排序算法,完成从大到小排序后再输出 这里提供另外一种思路 了解c中sort()函数。sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为…

nginx rewrite指令的深入理解

目录 1. 指令格式2. rewrite指令3. break指令4. return指令 nginx提供了强大的url rewrite功能。在nginx http模块的11个处理阶段中,有NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE两个阶段来进行url rewrite的处理。而last、break、redirect、permenent…

政安晨:【完全零基础】认知人工智能(四)【超级简单】的【机器学习神经网络】—— 权重矩阵

预备 如果小伙伴们第一次看到这篇文章,同时也对这类知识还是稍感陌生的话,可以先看看我这个系列的前三篇文章: 政安晨:【完全零基础】认知人工智能(一)【超级简单】的【机器学习神经网络】 —— 预测机ht…

【vue】组件通信方式介绍

当深入分析Vue 2的组件通信方式时,我们可以进一步详细地了解以下几种方法,并探讨它们的优缺点以及适用场景: Props & Events(父子组件通信): Props: 父组件通过props属性向子组件传递数据。子组件可以通过props选项…

【ARMv8M Cortex-M33 系列 8 -- RT-Thread 移植 posix pthread】

文章目录 RT-Thread POSIX PthreadRT-Thread Pthread 相关宏定义RT-Thread libc 初始化RT-Thread Pthread 测试 RT-Thread POSIX Pthread pthread是POSIX(Portable Operating System Interface)标准定义的一套线程相关的API,全称为POSIX Thr…

【Spring连载】使用Spring Data访问 MongoDB(一)----快速指南

【Spring连载】使用Spring Data访问 MongoDB(一)----快速指南 一、版本要求 一、版本要求 Spring Data MongoDB 4.x二进制文件需要JDK级别17及以上版本和Spring Framework 6.1.4及以上版本。 在数据库和驱动程序方面,你需要至少4.x版本的Mon…

jenkins离线安装一波

内网安装jenkins对于没有外网的看过来 插件下载神器-jenkins-plugin-manager 首先下载jenkins,官网地址我就不贴了下载完正常运行,开始界面不要选择任何插件安装,选择无去下载一个插件下载工具https://github.com/jenkinsci/plugin-installa…

《Solidity 简易速速上手小册》第1章:Solidity 和智能合约简介(2024 最新版)

文章目录 1.1 Solidity 的起源和重要性1.1.1 基础知识解析1.1.2 重点案例:去中心化金融 (DeFi) 平台案例 Demo:简易借贷平台 1.1.3 拓展案例 1:NFT 市场案例 Demo:简易 NFT 市场 1.1.4 拓展案例 2:智能合约管理的投票系…

C++ 区间合并 算法(详解) + 例题

1、定义 把所有,有交集的区间合并 图解: 2、实现 步骤如下: 1、首先按照每个区间左端点排序 2、扫描 所有区间,进行区间合并 上述第二条,可以理解为:拿出一个区间去跟它后面的所有的区间去进行合并&…

electron Tab加载动画开启和关闭

记个开发中的bug,以此为鉴。眼懒得时候手勤快点儿,不要想当然!!! 没有转载的价值,请勿转载搬运呦。 WebContents API: Event: did-finish-load​ 导航完成时触发,即选项卡的旋转…

conda 进入python环境里pip install安装不到该环境或不生效

参考:https://blog.csdn.net/weixin_47834823/article/details/128951963 https://blog.51cto.com/u_15060549/4662570?loginfrom_csdn 1、直接进入python Scripts目录下安装 cmd打开运行窗口,cd切换路径至指定虚拟环境下的Scripts路径后再pip安装 擦…

Asp.Net web 文件服務快速搭建

簡述 內容具體分為兩種分為上傳和下載部分,服務搭載仍然選擇IIS,內容還是相對簡單,只是內部使用,沒有使用太多的優化的技巧,net環境為4.7 上傳服務 上傳需要注意的是,HttpPostedFileBase 不支持大文件傳輸&#xff0…

文件上传漏洞--Upload-labs--Pass10--双写绕过

一、什么是双写绕过 顾名思义,双写绕过就是双写文件后缀名来进行绕过,如:test.php 双写后为 test.pphphp。通常情况下双写绕过用于绕过源代码中的 str_ireplace()函数。 二、双写绕过原理 1、首先进行代码审计,源代码中有黑名单…

ADO.NET大数据查询内存分页处理

ADO.NET大数据查询内存分页处理 在ADO.NET中处理大数据查询时,如果直接在客户端应用程序中进行内存分页,可能会导致内存使用量激增,特别是在处理数十万甚至数百万条记录时。为了避免这种情况,应该优先使用数据库层面的分页&#x…

Java 的 8 种异步实现方式

异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实…

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目,页面做的相当漂亮,所以选择了这个。可以参考2.3的效果图 惭愧,工作两年了也没个自己的博客系统,趁着过年时间,开始搭建一下. NBlog原项目的github链接:Naccl/NBlog: &#…

数据库||数据库的完整性

1.实验题目:数据库的完整性 2.实验目的和要求: 掌握数据库的实体完整性约束定义,完整性检查及违约处理方式。 掌握数据库的参照完整性约束定义,完整性检查及违约处理方式。 掌握数据库的用户定义完整性约束定义,完…

如何构建企业专属GPT

大语言模型(LLM)具有令人印象深刻的自然语言理解和生成能力, 2022年11月底OpenAI发布了ChatGPT,一跃成为人工智能AI领域的现象级应用。但由于LLM的训练数据集主要来源于互联网数据,企业私域信息并未被LLM所训练&#x…

LeetCode 3028.边界上的蚂蚁

边界上有一只蚂蚁&#xff0c;它有时向 左 走&#xff0c;有时向 右 走。 给你一个 非零 整数数组 nums 。蚂蚁会按顺序读取 nums 中的元素&#xff0c;从第一个元素开始直到结束。每一步&#xff0c;蚂蚁会根据当前元素的值移动&#xff1a; 如果 nums[i] < 0 &#xff0…