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()

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

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

相关文章

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

C语言 | Leetcode C语言题解之第5题最长回文子串

题目&#xff1a; 题解&#xff1a; char* longestPalindrome(char* s) {int lenstrlen(s),max0;int p0;for(int i0;i<len;i)//这种是判断奇数回文{int lefti-1,righti1;//left左边&#xff0c;right右边while(left>0&&right<len&&s[left]s[right]){/…

是否有替代U盘,可安全交换的医院文件摆渡方案?

医院内部网络存储着大量的敏感医疗数据&#xff0c;包括患者的个人信息、病历记录、诊断结果等。网络隔离可以有效防止未经授权的访问和数据泄露&#xff0c;确保这些敏感信息的安全。随着法律法规的不断完善&#xff0c;如《网络安全法》、《个人信息保护法》等&#xff0c;医…

Linux提权!!!

上一篇文章讲了Windows的提权&#xff0c;那么这篇文章就来讲一下Linux的提权 1.SUID提权 suid权限 作用&#xff1a;让普通用户临时拥有该文件的属主的执行权限&#xff0c;suid权限只能应用在二进制可执行文件&#xff08;命令&#xff09;上&#xff0c;而且suid权限只能设置…

基于Springboot会员制医疗预约服务管理信息系统

采用技术 基于Springboot会员制医疗预约服务管理信息系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 功能清单 系统功能 首页 医院信息 坐诊信息…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案&#xff0c;然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性&#xff08;Self-consistency&#xff09; 多个思维链&#xff0c;然后取…

使用docker部署MongoDB数据库

最近由于工作需要搭建MongoDB数据库&#xff1a;将解析的车端采集的数据写入到数据库&#xff0c;由于MongoDB高可用、海量扩展、灵活数据的模型&#xff0c;因此选用MongoDB数据库&#xff1b;由于现公司只有服务器&#xff0c;因此考虑容器化部署MongoDB数据&#xff0c;特此…

微信开发工具——进行网页授权

微信开发工具——进行网页授权 微信公众平台设置 1.在首页创建好自己的订阅号 网站&#xff1a;https://mp.weixin.qq.com/ 点击立即注册,在选择订阅号&#xff08;个人创建使用&#xff09; 之后按流程填写后&#xff0c;点击设置与开发-------->基本配置&#xff0c;这…

软考高级架构师:性能评价方法概念和例题

一、AI 讲解 性能评价是衡量计算机系统或其组件在指定条件下执行预期任务的有效性的一种方式。性能评价的方法主要可以分为几种&#xff0c;每种方法都有其特点和适用场景。 性能评价方法 方法描述时钟频率法通过计算机的时钟频率来评估性能&#xff0c;时钟频率越高&#x…

Go 源码之 Chan

Go 源码之 chan go源码之chan - Jxy 博客 目录 Go 源码之 chan一、总结二、源码&#xff08;一&#xff09;hchan&#xff08;二&#xff09;创建&#xff08;三&#xff09;发送&#xff08;四&#xff09;接收&#xff08;五&#xff09;关闭 三、常见问题1.为什么要使用环形…

C++语言学习(三)——内联函数、auto、for循环、nullptr

1. 内联函数 &#xff08;1&#xff09;概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 内联函数是一种编译器指令&#xff0c;用于告诉编译器…

【教程】Kotlin语言学习笔记(六)——泛型

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…