Go语言对于MySQL的基本操作

一.下载依赖

终端中输入:

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

导入包

import ("database/sql"_ "github.com/go-sql-driver/mysql"
)

 

二.案例

package main//go get-u github.com/go-sql-driver/mysql  获取驱动
import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)var db *sql.DB
//根据数据库表中,有属性id,name,age,且id为插入时,自增1
var usergroup map[int]user = make(map[int]user, 100)type user struct {id   intname stringage  int
}func initDB() (err error) {//连接数据库dsn := "root:9826942694yzy@tcp(127.0.0.1:3306)/sql_test"db, err = sql.Open("mysql", dsn) //dsn格式不对这里会报错if err != nil {fmt.Printf("dsn: %s invaid! err:%v\n", dsn, err)return err}//判断一下是否连接成功err = db.Ping()if err != nil {fmt.Printf("open %s failed! err:%v\n", dsn, err)return err} else {fmt.Printf("open %s success!\n", dsn)}//设置数据库连接池的最大连接数,根据业务调整db.SetMaxOpenConns(10)db.SetMaxIdleConns(5) //最大闲置连接数return nil
}// 输入id,返回对应的user信息  查询单条记录
func queryOne(id int) (u user, err error) {//查询单条语句sqlstr := "select * from user where id=?" //?为占位符,在Query的时候可以用后续的参数进行填充rowObj := db.QueryRow(sqlstr, id)         //从数据库连接池中拿去一个连接去进行查询//得到了rowObj必须调用Scan方法,因为该方法会释放数据库连接,把连接放回连接池,否则连接池最大连接用完,则会影响后续连接查询rowObj.Scan(&u.id, &u.name, &u.age)if rowObj == nil {fmt.Printf("query failed,err:%v\n", err)return u, err}return u, nil
}// 查询多行  读取到map中
func query() (err error) {sqlstr := "select * from user"rows, err := db.Query(sqlstr)if err != nil {fmt.Printf("query failed,err:%v\n", err)return}//记得关闭,放回连接池defer rows.Close()var u user//用一个for循环,把每次读到的行信息,存放到全局变量usergroup中,达到程序启动初始化的效果for rows.Next() {err = rows.Scan(&u.id, &u.name, &u.age)if err != nil {fmt.Printf("scan failed,err:%v\n", err)return}usergroup[u.id] = u}return nil
}// 插入一条学生数据,并且更新map  id是主码,
//实际插入学生数据的时候,并不知道数据库中学号应该分配多少,所以在插入后得到返回的id,再更新map
func insert(u user) (id int64, err error) {sqlstr := "insert into user(name,age) values(?,?)"var res sql.Result//执行该语句res, err = db.Exec(sqlstr, u.name, u.age)if err != nil {fmt.Printf("insert failed,err:%v\n", err)return}//拿到插入的id,返回id, err = res.LastInsertId()if err != nil {fmt.Printf("insert failed,err:%v\n", err)return}return id, nil
}//删除指定id的user,实际上最好判断一下是否存在map中,这里就先不写了
func deleteUser(id int) (err error) {sqlstr := "delete from user where id=?"_, err = db.Exec(sqlstr, id)if err != nil {fmt.Printf("delete failed,err:%v\n", err)return err}delete(usergroup, id)return nil
}// 查询单条语句
func test01() {//查询学号为1的学生信息u, err := queryOne(1)if err != nil {fmt.Printf("query failed,err:%v\n", err)return}println(u.id, u.name, u.age)}// 程序初始化时,把user表中信息全部读取到map中
func readToMap() {//从数据库中读取user放入map中err := query()if err != nil {fmt.Printf("query failed,err:%v\n", err)return}
}// 测试插入
func myInsertTest() {var u useru.age = 23u.name = "周杰伦"id, err1 := insert(u)if err1 != nil {fmt.Printf("insert failed,err:%v\n", err1)return}//说明插入成功u.id = int(id)usergroup[u.id] = u
}//遍历map
func printMap() {//遍历for _, u := range usergroup {println(u.id, u.name, u.age)}println("***************************************")
}func main() {err := initDB()defer db.Close()if err != nil {fmt.Printf("init db failed,err:%v\n", err)return}readToMap()printMap()myInsertTest()printMap()}

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

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

相关文章

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信,但是前面的传递并没有完全体现出HTTP的序列化和反序列化,为了更好得理解其工作流程,在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…

基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统 应用背景 为方便实验室进行设备管理,某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录,查看现有的所有设备, 增加设备等功能。 开发环境 Mac OSPyCharm IDEPython3Flask&#xff…

深拷贝and浅拷贝!

一、什么是拷贝?什么是深拷贝和浅拷贝? (1)拷贝:拷贝就是为了复用原对象的部分or全部数据,在原对象的基础上通过复制的方式创建一个新的对象。 拷贝对象可以分为三种类型:直接赋值、浅拷贝和深拷…

高频面试题(含笔试高频算法整理)基本总结回顾43

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的混元谷,谷中有一座巨大的混元金斗,斗身闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:“欲…

网络爬虫【简介】

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲视图 一、网络爬虫的定义 网络爬虫(Web Crawler),又称为网络蜘蛛、网络机器人等,是一种按照一定规则自动抓取互联网信息的程序或脚本。它…

​AI时代到来,对电商来说是效率跃升,还是温水煮青蛙

​凌晨三点的义乌商贸城,95后创业者小王,静静地盯着屏幕上的AI工具,竟露出了笑容。这个月他的跨境玩具店销量提升了不少,从之前的状态翻了3倍;而且团队人数有所变化,从5人缩减到了2人(其中包括他…

PDF文件密码保护破解:安全解密的步骤与技巧

PDF文件加密后,需要特定的密码才能访问内容。以下是一些常见的方法来解密PDF文件: 方法一:使用Adobe Acrobat 如果你有Adobe Acrobat Pro,可以使用它来解密PDF文件。 打开Adobe Acrobat Pro: 启动Adobe Acrobat Pro…

qt 自带虚拟键盘的编译使用记录

一、windows 下编译 使用vs 命令窗口,分别执行: qmake CONFIG"lang-en_GB lang-zh_CN" nmake nmake install 如果事先没有 指定需要使用的输入法语言就进行过编译,则需要先 执行 nmake distclean 清理后执行 qmake 才能生效。 …

Java开发之数据库应用:记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的“dual“表陷阱与突围之路

记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的"dual"表陷阱与突围之路 一、惊魂时刻:数据库切换引发的系统雪崩 某医疗影像系统在进行国产化改造过程中,将原MySQL数据库迁移至PostgreSQL。迁移完成后,系…

C++刷题(二):栈 + 队列

📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

精通游戏测试笔记(持续更新)

第一章、游戏测试的两条规则 不要恐慌 不要将这次发布当作最后一次发布 不要相信任何人 把每次发布当作最后一次发布 第二章:成为一名游戏测试工程师

Windows功能之FTP服务器搭建

一、创作背景 之前有用linux系统搭建过ftp服务器,最近想着用windows系统也顺便搭建一个,看网上有第三方服务软件一键部署,记得windows可以不借助第三方软件就可以搭建,就想顺便操作试试,结果老是连接不上,费…

星型组网模块的两种交互方式优缺点解析

星型组网模块简介 星型组网模块工作在433MHz频段;星型组网模块集主机(协调器)、终端为一体,星型组网模块具有长距离、高速率两种传输模式,一个主机(协调器)支持多达200个节点与其通讯&#xff0…

二分+前缀和——森林的最大美丽值

森林的最大美丽值(二分差分数组) 题目分析 求最小值的最大值,联想到二分。 第一阶段二段性分析 对于所有树的高度都可以大于等于mid,那么我们可以确定高度小于mid的值一定也可以,但是此时我需要找的是最大的高度,那么mid一定比…

Pytorch实现之最小二乘梯度归一化设计

简介 简介:LSGAN提出了一种利用最小二乘法来计算两个数据分布之间的距离,该论文在此基础上采用梯度归一化来进一步稳定训练。 论文题目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一种新的生成对抗网络的最小…

JavaScript基础-全局作用域

在JavaScript编程中,理解变量的作用域是编写高效、可维护代码的关键之一。全局作用域是指变量在整个程序范围内都可访问的状态,这意味着它们可以在任何函数或代码块中被读取和修改。然而,过度使用全局变量也可能导致一些问题,如命…

【2025.3.13】记一次双系统笔记本加装固态硬盘记录 linux扩容 linux更换/home和/opt所在硬盘 windows无法调整亮度

文章目录 🌕事情经过🌕更换/home和/opt的挂载硬盘🌙目的🌙初始化1t固态硬盘🌙打开Linux查看硬盘信息🌙给新1t固态硬盘分区🌙格式化分区🌙把新1t固态硬盘先挂载到/mnt/ssd_1t 用于后续…

山东省新一代信息技术创新应用大赛-计算机网络管理赛项(样题)

目录 竞赛试题 网络拓扑 配置需求 虚拟局域网 IPv4地址部署 OSPF及路由部署 配置合适的静态路由组网 MSTP及VRRP链路聚合部署 IPSEC部署 路由选路部署 设备与网络管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 竞赛试题 本竞赛使用HCL(华三云实验室)来进行网络设备选择…

【测试语言基础篇】Python基础之List列表

一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 Python有6个序列的内置类型,但最常见的是列表和元组。序列都可…