Go学习(四):golang连接mysql数据库查询数据库信息

14.go语言连接mysql go get 连接MySQL数据库 阅读详情
AI摘要

本文介绍了如何使用Go语言连接MySQL数据库,包括基本的连接方法、查询数据的Scan方式、使用切片接收查询结果,以及实现增删改操作的函数示例。

目录

1、Go连接Mysql

2、一般查询方法Scan

3、采用切片类型的结构体接受查询数据库信息返回的参数

4、增加

5、删除

6、修改


1、Go连接Mysql

安装依赖code:

go get -u github.com/go-sql-driver/mysql

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	

}

2、一般查询方法Scan

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

// Book 书籍
type Book struct {
	BookId      int    // 书籍 ID
	Title       string // 书名
	Author      string // 作者
	PublishDate string // 出版日期
}

// 查询数据一般使用 Scan
// 缺点,不通用,不同的表的查询需要定义不同的结构体,然后写不同的 Scan。
func searchBook1(db *sql.DB) ([]Book, error) {
	var books []Book
	//查询语句
	sql := `select book_id,title,quthor,to_char(publish_date, 'YYYY/MM/DD') as publish_date from book`
	rows, err := db.Query(sql)
	if err != nil {
		log.Panicln(err)
		return books, err
	}
	defer rows.Close() //这个语句干吗的
	for rows.Next() {
		var book Book
		// 获取各列的值,放到对应的地址中
		rows.Scan(&book.BookId, &book.Title, &book.Author, &book.PublishDate)
		books = append(books, book)
	}
	return books, nil
}

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	searchBook1(db)

}
输出:[{1 活着 余华 2012-08-01}] 

3、采用切片类型的结构体接受查询数据库信息返回的参数

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

// Book 书籍
type Book struct {
	BookId      int    // 书籍 ID
	Title       string // 书名
	Author      string // 作者
	PublishDate string // 出版日期
}


// 采用切片类型的结构体接受查询数据库信息返回的参数
func searchBook2(db *sql.DB, sSql string) ([]map[string]interface{}, error) {
	// 准备查询语句
	stmt, err := db.Prepare(sSql)
	if err != nil {
		log.Println(err)
		return nil, err
	}
	defer stmt.Close()

	// 查询
	rows, err := stmt.Query()
	if err != nil {
		log.Println(err)
		return nil, err
	}
	defer rows.Close()
	// 数据列
	columns, err := rows.Columns()
	if err != nil {
		log.Println(err)
		return nil, err
	}

	// 列的个数
	count := len(columns)

	// 返回值 Map切片
	mData := make([]map[string]interface{}, 0)
	// 一条数据的各列的值(需要指定长度为列的个数,以便获取地址)
	values := make([]interface{}, count)
	// 一条数据的各列的值的地址
	valPointers := make([]interface{}, count)
	for rows.Next() {

		// 获取各列的值的地址
		for i := 0; i < count; i++ {
			valPointers[i] = &values[i]
		}

		// 获取各列的值,放到对应的地址中
		rows.Scan(valPointers...)
		fmt.Println(valPointers)
		fmt.Println(values)
		// 一条数据的Map (列名和值的键值对)
		entry := make(map[string]interface{})

		// Map 赋值
		for i, col := range columns {
			var v interface{}

			// 值复制给val(所以Scan时指定的地址可重复使用)
			val := values[i]
			fmt.Println(val)
			b, ok := val.([]byte)
			if ok {
				// 字符切片转为字符串
				v = string(b)
			} else {
				v = val
			}
			entry[col] = v
			fmt.Println(entry)
		}

		mData = append(mData, entry)
	}

	return mData, nil
}

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	sql := "select book_id, title, author,publish_date from book"
	searchBook2(db, sql)

}

输出: 

[0xc0000a2080 0xc0000a2090 0xc0000a20a0 0xc0000a20b0]
[1 [230 180 187 231 157 128] [228 189 153 229 141 142] [50 48 49 50 45 48 56 45 48 49]]
1
map[book_id:1]
[230 180 187 231 157 128]
map[book_id:1 title:活着]
[228 189 153 229 141 142]
map[author:余华 book_id:1 title:活着]
[50 48 49 50 45 48 56 45 48 49]
map[author:余华 book_id:1 publish_date:2012-08-01 title:活着]

4、增加

func insert(db *sql.DB, sqlStr string) {

	ret, err := db.Exec(sqlStr) //执行sql语句
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	//如果是插入数据的操作,能够拿到插入数据的id
	id, err := ret.LastInsertId()
	if err != nil {
		fmt.Printf("get id failed,err:%v\n", err)
		return
	}
	fmt.Println("id", id)
}
sqlStr := `insert into book(title,author,publish_date) values("哈利波特","JK罗琳","2008-12-1")` //sql语句
insert(db, sqlStr)

5、删除

func deleteRow(db *sql.DB, id int) {
	sqlStr := `delete from book where book_id=?`
	ret, err := db.Exec(sqlStr, id)
	if err != nil {
		fmt.Printf("delete faild,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("删除了%d行数据\n", n)

}
deleteRow(db, 2)

6、修改

func updateRow(db *sql.DB, au string, id int) {
	sqlStr := `update book set author=? where book_id=?`
	ret, err := db.Exec(sqlStr, au, id)
	if err != nil {
		fmt.Printf("update failed ,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("更新了%d行数据\n", n)
}
updateRow(db, "余华1", 1)
golang学习笔记18——golang 访问 mysql 数据库全解析 在现代软件开发中,数据存储和访问是至关重要的环节。MySQL 作为一款流行的关系型数据库,经常需要与各种编程语言进行交互。Golang 以其高效、简洁的特性,在数据库访问方面也有着出色的表现。本文将详细介绍 Golang 如何访问 MySQL 数据库,并配合代码示例进行说明。通过以上步骤,我们可以在 Golang 中有效地访问 MySQL 数据库,进行各种查询和操作。在实际应用中,我们可以根据具体的业务需求灵活运用这些方法,构建强大而高效的数据库应用程序。 阅读详情

相关推荐

Go语言操作Redis与MySQL实战指南

Redis作为高性能内存数据库与MySQL作为关系型数据库的组合,是现代应用开发中常见的数据存储解决方案。Redis通过丰富的数据结构和极快的读写速度,特别适合缓存、会话管理等场景;而MySQL则以其强大的事务支持和复杂查询能力,成为业务数据持久化的首选。在Go语言生态中,通过go-redis和go-sql-driver/mysql等驱动库,开发者可以高效地实现数据库操作。本文从基础连接配置讲起,详细介绍了CRUD操作、事务处理、连接池优化等核心内容,并分享了实际项目中Redis作为缓存层、分布式锁实现等典

weixin_34082695的博客 494

【搞定Go语言】第3天1:Go语言操作MySQL

MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库。 Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。 我们常用的数据库基本上都有完整的第三方实现。例如:MySQL驱动 下载依赖 go get -u github.com/go-sql-driver/mysql 使用MySQL驱动 func Open(driverName, dat

就叫一片白纸的博客 840

Go语言中使用MySQL的最佳实践

以上就是使用Go语言与MySQL进行交互的一些最佳实践。通过合理地使用数据库驱动和执行相应的操作,我们可以轻松地在Go语言中操作MySQL数据库。函数用于创建数据库连接对象,第一个参数指定数据库驱动名称为"mysql",第二个参数是连接字符串,包括用户名、密码、主机和端口以及数据库名称。在Go语言中,使用MySQL数据库是非常常见的任务。本文将介绍一些使用Go语言与MySQL进行交互的最佳实践,并提供相应的源代码示例。通过传递参数,可以实现对表中数据的插入、更新和删除。将每一列的值存储到对应的变量中。

DfsnVue的博客 285

Go语言操作MySql数据库

go-sql-driver/mysql库是Go语言官方推荐的MySQL驱动库,可以很方便地实现对MySQL数据库的连接和操作。本文记录以下使用go-sql-driver/mysql数据库驱动来操作mysql数据库。

hsy12342611的专栏 5754

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7810

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 522

Golang 获取MySQL表元信息

Golang 获取MySQL表元信息 本文介绍Golang如何操作数据库,并通过获取Mysql表元信息进行实例演示。 1. Golang 操作DBMS Golang 通过标准database/sql包实现了对关系型数据库很好的支持,如MySQL, MS SQL Server, Oracle 和 Postgres,当然NoSql也没有问题,如MongoDB、Redis。 使用Golang标准库可以很...

neweastsun的专栏 5147

冒险岛脚本函数大全:cm.sendYesNo和cm.warp的20个实战用法

本文深入解析了冒险岛脚本中cm.sendYesNo和cm.warp两个核心函数的20个实战应用场景。从基础的确认对话框交互、条件判断,到复杂的装备强化系统、动态传送与副本入口逻辑,文章通过大量代码示例展示了如何组合运用这两个函数,实现从简单NPC到复杂任务系统的进阶脚本开发,并分享了状态管理、错误处理与性能优化等最佳实践。

t4y5u6i7o的博客 1055

【Go Web学习笔记】第五章 Go操作MySQL数据库

前言:大家好,以下所有内容都是我学习韩茹老师的教程时所整理的笔记。部分内容有过删改, 推荐大家去看原作者的文档进行学习, 本文章仅作为个人的学习笔记,后续还会在此基础上不断修改。学习Go Web时应该已经熟悉Go语言基本语法以及计算机网络的相关内容。 学习链接:https://www.chaindesk.cn/witbook/17/253 参考书籍:《Go Web编程实战派》 第五章、Go操作MySQL数据库 使用MySQL数据库 目前Internet上流行的网站构架方式是LAMP,其中的 M 即 M.

ClimberCoding 1641

编程语言的未来走向:趋势、挑战与机遇

同时,鼓励他们接触和掌握一些专业领域的开发工具和技术框架,比如Web开发中的JavaScript、React.js,数据分析的Python(Pandas, NumPy, Matplotlib等),以及人工智能和机器学习领域的TensorFlow、PyTorch等。当前,全球范围内正积极推动编程教育的普及化,从儿童启蒙阶段到高等教育阶段,乃至终身学习的过程中,如何优化编程语言的教学方法、提高教学质量,并将其广泛应用于不同领域,是教育者与政策制定者面临的重大课题。未来,编程语言的多样化和包容性将会继续加强。

zrc_xiaoguo的博客 1827

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

golang获取mysql表结构_Golang 获取MySQL表元信息

Golang 获取MySQL表元信息本文介绍Golang如何操作数据库,并通过获取Mysql表元信息进行实例演示。1. Golang 操作DBMSGolang 通过标准database/sql包实现了对关系型数据库很好的支持,如MySQL, MS SQL Server, Oracle 和 Postgres,当然NoSql也没有问题,如MongoDB、Redis。使用Golang标准库可以很容易与M...

weixin_29696567的博客 1412

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 246

go操作mysql

目录 一、使用包database/sql 1、DB(数据库对象) 2、Results 和 Result(结果集) 3、Statements(语句) 二、增删改 Exec()方法 三、Query() 方法使用 四、Get() 方法使用 五、Select() 方法使用 六、连接池 1、连接池说明 2、连接池配置 3、数据库连接重试次数 一、使用包database/sql database/sql 是 Go 操作数据库的标准库之一,它提供了一系列接口方法,用于访问数据库(mys

大道至简,持之以恒! 9961

【生产实践】PostgreSQL高可用Patroni安装(超详细已踩坑)

一 安装Patroni 0 Patroni 对Python的版本要求 我安装的是Patroni最新版本 :4.0.3,Patroni 对Python 版本有要求,没有具体的版本矩阵,但是根据每个版本发布信息可以得到以下信息 Patroni 4.0 需要 Python 3.8 以上(可以根据下面发布版本信息推理出) Version 3.0.2 Version 3.0.2 dropped support of Python older than 3.6. 版本3.0.2不再支持3.6版本以下的P

DBA之路的博客 1739

RK3568平台开发系列讲解(外设篇)CAN的使用

📢 本篇章带大家快速了解CAN的使用。

内核笔记 2352

go连接数据库(原生)

根据官网文档可以看到go可以连接的关系型数据库​常用的关系型数据库基本上都支持,下面以mysql为例。

qq_62408075的博客 1871

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

go mysql_Go 操作 Mysql(一)

关于 Go 的标准库 database/sql 和 sqlxdatabase/sql 是 Go 操作数据库的标准库之一,它提供了一系列接口方法,用于访问数据库(mysql,sqllite,oralce,postgresql),它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现而通常在工作中,我们更多的是用 https://github.com/jmoiron/sqlx 包来操作数据...

weixin_29525745的博客 2623

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Golang】 在Go语言中查询MySQL的processlist线程

在数据库管理和性能调优中,了解数据库的运行状态是非常重要的。MySQL提供了一个名为SHOW PROCESSLIST的命令,以及一个information_schema.processlist表,可以让我们查看当前正在运行的数据库线程。在Go语言中,我们可以使用GORM库来执行这些查询。在本文中,我们将讨论如何在Go中查询MySQL的processlist线程。通过查询MySQL的processlist,我们可以获取数据库的运行状态,这对于数据库性能调优和故障排查非常有用。

tr6666的博客 862

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Go database/sql 教程

Go database/sql 教程

u010890594的博客 1198

golang windows mysql_windows 安装Go 环境 搭建Mysql数据库连接

在linux 上做go 环境搭建 已经可以了。并且 连接上了 mysql 数据库。但是 开发 还是 在windows 上面的比较多。所以要研究下 windows 下如何弄 。需要使用一个mingw 的环境 。 要使用make 命令官网:http://www.mingw.org/下载http://sourceforge.net/projects/mingw/files/安装:安装 基本编译环境。...

weixin_34603528的博客 100

Python爬虫+Go WebServer+Flutter App(GoLang篇)

文章目录 last

zxlworking1的专栏 1104

go 返回mysql数组_Go基础之--操作Mysql(一)

关于标准库database/sqldatabase/sql是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库。它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现。database/sql库提供了一些type。这些类型对掌握它的用法非常重要。DB数据库对象。 sql.DB类型代表了数据库。和其他语言不一样,它并是数据库连接。golang中的连接来自内部实现的连接池,...

weixin_29586681的博客 1415

一、Go基础知识33、数据库连接Mysql

GO:数据库连接、Mysql、连接池、事务

风不归的乐园 608

基于Go语言与MySQL和Redis的交互实现二级缓存的小案例

此小案例是对Go语言实战:二级缓存框架的学习后,自己进行了总结与修改,视频中用的是sqlx的库,本文采用gorm数据库。 实现的功能: 优先从Redis获取数据,当Redis没有数据时从MySQL加载并同步缓存到Redis,缓存时间60秒。 实现过程: 连接redis数据库,MySQL数据库(注意导入包: _ “github.com/go-sql-driver/mysql”) 根据命令是否进行查...

lili9415的博客 1818

阿里云服务器搭建Golang运行环境

阿里云服务器搭建Golang运行环境1. 下载安装Golang2. 使用9090端口编写网页 1. 下载安装Golang 下载Golang安装包: 解压之: tar -zxvf go1.14.2.linux-amd64.tar.gz -C /usr/local/ 创建工作目录: mkdir -p go/src go/bin go/pkg 目录结构如下: 添加Golang相关环境:使用vim编辑以下文件: vi /etc/profile 添加以下内容: export GOROOT=/usr/loc

weixin_43959184的博客 2356
上一篇: Go学习(三):Map、结构体
下一篇: Go学习(五):流程控制
Lay_XZ
博客等级 码龄5年 29粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值