当前位置: 首页 > news >正文

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库

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

Expected class selector “.menuChildMall“ to be kebab-case报错原因

![在这里插入图片描述](https://img-blog.csdnimg.cn/dire ct/6b72bda760a2497a90558d48bd0a4de3.png) 使用stylelint格式化css文件时候报上述错误: 原因: css类名未使用-分隔符 将类名修改为: .menu-child-mall形式即可...

NC文件不规则裁剪(利用shp文件裁剪)(三)

文章目录 前言实例数据代码部分需要的库加载文件写入地理信息裁剪NC结果 完整代码奉上 前言 Hello大家好呀,最近正好需要用到多个SHP去裁剪NC,按照我以前的两种办法(办法1和办法2)操作的话,我自己都会破防&#xff0c…...

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展,数字化转型已经成为企业转型升级的必由之路。而在数字化转型中,三防平板作为一种重要的工具,可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…...

【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)

阅读导航 引言一、生产者消费者模型二、环形队列简介三、基于环形队列的生产者消费者模型(C 代码模拟实现)⭕Makefile文件⭕ . h 头文件✅sem.hpp✅ringQueue.hpp ⭕ . cpp 文件✅testMain.cpp 温馨提示 引言 在上一篇文章中,我们深入探讨了…...

【Docker】Docker存储卷

文章目录 一、什么是存储卷二、为什么需要存储卷三、存储卷分类四、管理卷Volume创建卷方式一:Volume 命令操作方式二:-v 或者--mount 指定方式三:Dockerfile 匿名卷 操作案例Docker 命令创建管理卷Docker -v 创建管理卷Docker mount 创建管理…...

基于python的租车管理平台/汽车租赁网站

功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、详情页、用户中心、家政入驻模块。后台功能包括:总览、车辆管理、分类管理…...

【JVM】双亲委派机制

📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 双亲委派机制 在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载…...

分布式id实战

目录 常用方式 特征 潜在问题 信息安全 高性能 UUID 雪花算法 数据库生成 美团Leaf方案 Leaf-segment 数据库方案 Leaf-snowflake 方案 常用方式 uuid雪花算法数据库主键 特征 全局唯一趋势递增信息安全 潜在问题 信息安全 如果id连续递增, 容易被爬虫, 批量下…...

深入了解 SOCKS5 代理、代理 IP 和 HTTP

在网络通信和数据传输中,代理服务器扮演着至关重要的角色。本文将深入探讨 SOCKS5 代理、代理 IP 和 HTTP,揭示它们的工作原理、应用场景以及优缺点。 1. SOCKS5 代理 SOCKS(Socket Secure)是一种网络协议,允许客户端…...

外包干了3个多月,技术退步明显。。。。

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

Unity之闪电侠大战蓝毒兽(简陋的战斗系统)

目录 🎨一、创建地形 🎮二、创建角色 🏃2.1 动画 🏃2.2 拖尾 🏃2.3 角色控制 ​🏃2.4 技能释放 🏃2.5 准星 📱三、创建敌人 🐲3.1 选择模型 🐲3.…...

C# 菜鸟级别有关于redis的使用

public IActionResult Index() { ConnectionMultiplexer _conn ConnectionMultiplexer.Connect("127.0.0.1:6379");//初始化 var database _conn.GetDatabase(7);//指定连接的库 0 RedisHelper redisHelper new Redi…...

AlexNet的出现推动深度学习的巨大发展

尽管AlexNet(2012)的代码只比LeNet(1998)多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。 AlexNet(由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…...

2024面试offer收割宝典字节篇

1.IO 模型有哪些,讲讲你理解的 nio ,他和 bio,aio 的区别是啥, 谈谈 reactor 模型。 IO 模型主要包括以下几种:1. 阻塞 I/O (BIO): 当一个线程调用 read() 或 write() 系统调用时,如果数据没有准备好或者缓冲区已满,则该线程会被操作系统阻塞,直到有数据可读或写入完…...

冒泡排序及其优化

冒泡排序 int[] arr {1,3,2,9,4,7,2,8};//比较多少轮(n个数字比较n-1次)for(int i0,n arr.length;i<n-1;i) {//每轮比较多少次(n-1-i次)for(int j 0;j<n-1-i;j) {//两两比较if(arr[j] > arr[j1]) { //比较结果为升序排列&#xff0c;如果想要降序排列结果将 >…...

【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉

BioGPT LSTM 自动补全医院紧急部门主诉 问题&#xff1a;针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…...

HCIE-Datacom证书有效期多久?HCIE考试有哪些内容?

如今越来越多的人开始关注并参与到华为认证的学习中来。 其中&#xff0c;华为认证数据通信专家(HCIE-Datacom)作为华为认证体系中的高级认证&#xff0c;备受瞩目。 那么&#xff0c;关于HCIE-Datacom证书的有效期以及HCIE考试的内容&#xff0c;你知道多少呢&#xff1f;下…...

OpenCV中的边缘检测技术及实现

边缘检测是在电脑如何理解图片这一问题中的一环&#xff0c;它帮助电脑找出照片里的轮廓和分界线。想象一下你在看一幅黑白漫画&#xff0c;轮廓线定义了每一个角色和物体&#xff0c;而电脑要做的&#xff0c;就是通过边缘检测来找出这些线条。这在很多像是图像分析这样的领域…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...