go连接数据库(原生)
根据官网文档 Go Wiki: SQL Database Drivers - The Go Programming Language 可以看到go可以连接的关系型数据库
常用的关系型数据库基本上都支持,下面以mysql为例
下载mysql驱动
打开上面的mysql链接 GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package
注意:
从 Go 1.16 版本开始,go get 命令在没有模块的情况下不再被支持。现在,Go 强烈推荐使用模块管理依赖。要在你的项目中使用第三方库,你需要先创建一个模块。
首先,你需要进入你的项目目录,并初始化一个新的 Go 模块。在命令行中执行以下命令:
go mod init your_module_name
执行如下命令 (所在文件夹下必须有mod文件)
go get -u github.com/go-sql-driver/mysql
下载好后会在${GOPATH}/pkg目录下下载好依赖
编写go代码连接mysql
package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log"
)func main() {// 设置 MySQL 数据库连接信息dataSourceName := "root:123456@tcp(192.168.31.131:3306)/gotest"// 打开数据库连接db, err := sql.Open("mysql", dataSourceName)if err != nil {log.Fatal(err)}defer db.Close()// 尝试连接数据库err = db.Ping()if err != nil {log.Fatal("Could not connect to the database:", err)}fmt.Println("Connected to the MySQL database!")// 连接成功后,可以执行数据库操作,例如查询或插入数据// 例如,查询数据库中的数据rows, err := db.Query("SELECT * FROM album")if err != nil {log.Fatal("Error querying database:", err)}defer rows.Close()// 遍历查询结果for rows.Next() {var id intvar title stringvar artist stringvar price []uint8if err := rows.Scan(&id, &title, &artist, &price); err != nil {log.Fatal(err)}fmt.Println("id=> ", id, " title=> ", title, " artist=> ", artist, " price=>", string(price))}if err := rows.Err(); err != nil {log.Fatal(err)}
}
数据库操作
package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log"
)func main() {db := getDb()defer db.Close()//执行操作代码
}func getDb() *sql.DB {// 设置 MySQL 数据库连接信息dataSourceName := "root:123456@tcp(192.168.31.131:3306)/gotest"// 打开数据库连接db, err := sql.Open("mysql", dataSourceName)if err != nil {log.Fatal(err)}// 尝试连接数据库err = db.Ping()if err != nil {log.Fatal("Could not connect to the database:", err)}return db
}
预编译
只需要将sql中的参数变为? 后面加上就可以了
查询
查询一条
QueryRow最多检索单个数据库行,例如当您想通过唯一 ID 查找数据时。如果查询返回多行,该 Scan方法将丢弃除第一行之外的所有行。
func getOne(db *sql.DB) {row := db.QueryRow("select * from stu where id=1")//row := db.QueryRow("select * from stu")if row.Err() != nil {fmt.Println("查询失败")return}var stu Stuerr := row.Scan(&stu.id, &stu.name, &stu.age, &stu.address)if err != nil {fmt.Println("查询失败err")return}fmt.Println(stu)
}
这边如果查出来多条记录则只会取第一条
查询多条
Query您可以使用或查询多行QueryContext,它返回Rows表示查询结果的 。您的代码使用 迭代返回的行Rows.Next。每次迭代都会调用Scan将列值 复制到变量中。
func getMany(db *sql.DB) {rows, err := db.Query("select * from stu")if err != nil {fmt.Println("查询失败")return}defer rows.Close()stus := make([]Stu, 0)for rows.Next() {stu := Stu{}err := rows.Scan(&stu.id, &stu.name, &stu.age, &stu.address)if err != nil {fmt.Println("赋值失败")return}stus = append(stus, stu)}fmt.Println("=============")fmt.Println(stus)
}
增加
新增一条
func insertOne(db *sql.DB) {_, err := db.Exec("insert into stu(name,age,address) values (?,?,?)", "新增名字", 11, "新增地址")if err != nil {fmt.Println("插入失败", err)return}fmt.Println("插入成功")
}
新增多条
新增多条就需要事务
func insertMany(db *sql.DB) {insertSql := "insert into stu(name,age,address) values (?,?,?)"tx, err := db.Begin()if err != nil {fmt.Println("开启事务失败")return}prepare, err := tx.Prepare(insertSql)if err != nil {fmt.Println("预编译失败")return}defer prepare.Close()stus := make([]Stu, 0)for i := 0; i < 10; i++ {stus = append(stus, Stu{id: i,name: "批量新增名字" + strconv.Itoa(i),age: i,address: "批量新增地址" + strconv.Itoa(i),})}for _, stu := range stus {_, err := prepare.Exec(stu.name, stu.age, stu.address)if err != nil {fmt.Println("插入失败")return}}tx.Commit()fmt.Println("批量插入成功")
}
修改
更新一条
func updateOne(db *sql.DB) {updateSql := "update stu set name=?,age=? where id=?"prepare, err := db.Prepare(updateSql)if err != nil {fmt.Println("预编译失败")return}_, err = prepare.Exec("更新名称", 22, 62)if err != nil {fmt.Println("更新失败", err)return}fmt.Println("更新成功")
}
更新多条
更新多条需要使用事务
func updateMany(db *sql.DB) {updateSql := "update stu set address=? where id=?"tx, err := db.Begin()if err != nil {fmt.Println("开启事务失败")return}prepare, err := tx.Prepare(updateSql)if err != nil {fmt.Println("预编译失败")return}defer prepare.Close()stus := make([]Stu, 0)for i := 2; i < 10; i++ {stus = append(stus, Stu{id: i + 60,address: "批量更新地址" + strconv.Itoa(i),})}for _, stu := range stus {_, err := prepare.Exec(stu.address, stu.id)if err != nil {fmt.Println("批量更新失败")return}}tx.Commit()fmt.Println("批量更新成功")
}
删除
删除一个
func deleteOne(db *sql.DB) {deleteSql := "delete from stu where id=?"prepare, err := db.Prepare(deleteSql)if err != nil {fmt.Println("预编译失败")return}_, err = prepare.Exec(62)if err != nil {fmt.Println("删除失败", err)return}fmt.Println("删除成功")
}
删除多个
func deleteMany(db *sql.DB) {deleteSql := "delete from stu where id in (?,?)"prepare, err := db.Prepare(deleteSql)if err != nil {fmt.Println("预编译失败")return}_, err = prepare.Exec(63, 64)if err != nil {fmt.Println("批量删除失败", err)return}fmt.Println("批量删除成功")
}
事务
开启事务
tx, err := db.Begin()
提交事务
tx.Commit()
回滚事务
tx.Rollback()
相关文章:
go连接数据库(原生)
根据官网文档 Go Wiki: SQL Database Drivers - The Go Programming Language 可以看到go可以连接的关系型数据库 常用的关系型数据库基本上都支持,下面以mysql为例 下载mysql驱动 打开上面的mysql链接 GitHub - go-sql-driver/mysql: Go MySQL Driver i…...
【C语言】2048小游戏【附源码】
欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述: 2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。 每次移动操作,所…...
部署项目遇到的各种问题总结
文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后,为了让别人访问到自己的网站,就需要部署前端后端以及数据库,但是在部署的过程中出现了各种问题和困…...
JavaSE:抽象类和接口
目录 一、前言 二、抽象类 (一)抽象类概念 (二)使用抽象类的注意事项 (三)抽象类的作用 三、接口 (一)接口概念 (二)接口语法规则 (三&a…...
发票是扫码验真好,还是OCR后进行验真好?
随着科技的进步,电子发票的普及使得发票的验真方式也在不断演进。目前,我们常见的发票验真方式主要有两种:一种是扫描发票上的二维码进行验真,另一种是通过OCR(Optical Character Recognition,光学字符识别…...
【AIGC调研系列】AIGC+Jmeter实现接口自动化测试脚本生成
AIGC(人工智能生成内容)结合JMeter实现接口自动化测试脚本生成的方法,主要涉及到通过流量收集工具和AIGC技术获取用户操作接口数据,并利用这些数据生成自动化测试脚本的过程。这种方法可以有效提高软件测试的效率和质量[1]。JMete…...
前端|babel升级
问题 项目不支持可选链调用过多的 babel 插件 步骤 基础包 dependencies “react-scripts”: “5.0.1” devDependencies “customize-cra”: “^1.0.0”,“react-app-rewired”: “^2.2.1”, 框架包 dependencies “react”: “16.13.1”,“react-dom”: “16.13.1”, …...
【微服务】spring状态机模式使用详解
一、前言 在很多系统中,通常会涉及到某个业务需要进行各种状态的切换操作,例如在审批流程场景下,某个审批的向下流转需要依赖于上一个状态的结束,再比如电商购物场景中,一个订单的生命周期往往伴随着不同的状态&#…...
【算法刷题day14】Leetcode:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历
文章目录 二叉树递归遍历解题思路代码总结 二叉树的迭代遍历解题思路代码总结 二叉树的统一迭代法解题思路代码总结 草稿图网站 java的Deque 二叉树递归遍历 题目: 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 解析:代码随想录解析…...
mysql闲谈
如何定位慢查询 1、测试环境压测时,有的接口非常慢,响应时间超过2秒以上。当时系统部署了运维的监控系统Skywalking,在展示报表中可以看到是哪儿个接口慢,可以看到SQL具体执行时间。 2、如果没有类似的监控系统,在Mysq…...
物联网学习1、什么是 MQTT?
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通…...
【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析
一、引言 在机器学习项目中,数据探索是至关重要的一步。它不仅是模型构建的基础,还是确保模型性能稳定、预测准确的关键。数据探索的过程中,数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息ÿ…...
软件测试(一)--简介+主流技能+分类+模型+流程
一、软件及测试简介 1、软件生产过程 需求产生–需求文档–设计效果图–产品开发–产品测试(测试产品与需求文档是否一致)–部署上线 2、什么是软件测试 使用技术手段验证软件是否满足使用需求。 技术包括:(使用网络技术测试安…...
技术引领,策略升级:腾讯云与你共探数字金融新篇章
引言 2024 年 3 月 27 日下午,在北京腾讯总部,一场关于大模型与数据要素时代数字金融发展的深入讨论火热进行中。【TVP 走进腾讯:大模型与数据要素时代的数字金融发展论坛】是在腾讯二十年发展历程和数字化实践的基础上,进一步探索…...
数据库-root密码丢失的重置方案(win11环境)
当在windows系统中安装的mysql由于操作不当,或者密码遗忘,今天测试了一下,可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…...
免试生常问的一些问题汇总---专升本学习篇
1.你怎么理解你申请的专业? 答:软件工程室一门涉及软件开发、维护和管理的工程学科。它结合了计算机科学、工程学和管理科学的原理,皆在通过系统化、规范化的方法来开发高质量的软件系统。 1.技术和支持 :软件工程包括编程语言、算法、数据结构、软件设计模式、软件测试、…...
FPGA的就业前景
FPGA(Field-Programmable Gate Array)技术在数字电路设计和嵌入式系统开发方面具有广泛的应用,因此在FPGA领域有着较好的就业前景。 目前,FPGA在通信、计算机、消费电子、汽车、航空航天等行业中得到了广泛应用。随着新一代通信网…...
7.阻塞模式与非阻塞模式
1.阻塞模式 一个线程来处理多个连接显得力不从心 accept等待连接 是一个阻塞方法 read读取SocketChannel中的数据 是一个阻塞方法 /*** 服务端* param args* throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer b…...
Unity类银河恶魔城学习记录11-10 p112 Items drop源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…...
EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格
xls文件: 后端代码: InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
