点击上方“Go语言进阶学习”,进行关注

回复“Go语言”即可获赠从入门到进阶共10本电子书

前言

通常情况下,我们程序员和数据库打交道是最多的。要然我们怎么会被称为码农呢。

存用户信息需要数据库,存订单需要数据库,等等等等,现在真是数据驱动着发展。

但是数据库种类有很多,有MysqlOracleSQL Server

本篇就示例如何Go操作Mysql

准备工作

本次使用的是go mod进行包依赖管理,使用的库是go-sql-driver/mysql

准备工作之连接数据库

代码

func main() {var username = "root"var password = "rootroot"var ip = "127.0.0.1"var port = "3306"var data = "go_mysql_demo"var dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, data)//Open只会验证dsb的格式是否正确,不会验证是否连接成功,同理,密码是否正确也不知道db, err := sql.Open("mysql", dsn)if err != nil {panic(err)
}//关闭连接在 err 之后,因为可能直接就打开不成功,关闭一个没有打开的连接???defer db.Close()// 此时尝试连接数据库,会判断用户,密码,ip地址,端口是否正确err = db.Ping()if err != nil {fmt.Println("连接数据库失败,",err)return
}//设置与数据库建立连接的最大数目,一般不管db.SetMaxOpenConns(100)//设置连接池中的最大闲置连接数,一般不管db.SetMaxIdleConns(50)
}

注意

  • sql.Open只会验证格式是否正确,不会连接数据库

  • db.Closeerr之后,是因为可能打开不成功,关闭一个没有打开的连接。

  • db.Ping会连接数据库,判断用户密码ip地址端口是否正确。

准备工作之创建表

我们创建一个简单的用户表。

CREATE TABLE `userinfo` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,`phone` char(11) DEFAULT NULL,`address` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

准备工作之创建结构体

假设上述工作都完成了啊。

不知道有没有想过,我们查询的数据,存成啥?,字符串?map?切片?,似乎都不是太好。

只有结构体是最清晰的,最好认识的。

结构体

type Userinfo struct {Id      int64  `json:"id"`Name    string `json:"name"`Phone   string `json:"phone"`Address string `json:"address"`
}

查询单条

单条查询使用QueryRow方法。

代码

//查询单条
sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;"
var user Userinfo
/*QueryRow 第二个参数可以接收多个参数,同理,sqlStr可以有多个 ?占位符 进行匹配QueryRow 之后必须调用Scan方法进行数据绑定,进行数据库链接释放
*/
err = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address)
if err != nil {fmt.Println("查询失败", err)return
}
fmt.Println(user)

执行结果

查询多条

多行查询使用Query

代码

//查询多条
sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?"
//参数同 QueryRow
rows, err := db.Query(sqlStr, 1)
if err != nil {fmt.Println("查询失败:", err)return
}
// 此处使用rows释放所有链接
defer rows.Close()
//循环整理所有数据
var userList = make([]Userinfo, 0, 10)
for rows.Next() {
var user Userinfo
err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address)
if err != nil {fmt.Println("绑定数据失败", err)return
}
userList = append(userList, user)
}
fmt.Println(userList)

执行结果

插入数据

插入数据需要用到Exec

代码

//插入数据
sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);"
result, err := db.Exec(sqlStr, "吴彦祖", 555, "不知道哪的")
if err != nil {fmt.Println("插入失败", err)return
}
//受影响的行数
row_affect, err := result.RowsAffected()
if err != nil {fmt.Println("受影响行数获取失败:", err)return
}
fmt.Println("受影响的行数:", row_affect)
lastId, err := result.LastInsertId()
if err != nil {fmt.Println("新增行id获取失败:", err)return
}
fmt.Println("新增行id:", lastId)
fmt.Println("插入成功")

执行结果

Mysql

更新数据

更新和添加差不多,用的都是Exec

代码

//更新数据
sqlStr := `UPDATE userinfo set name=? where id=?;`
result, err := db.Exec(sqlStr, "吴彦祖666", 3)
if err != nil {fmt.Println("更新失败", err)return
}
//受影响的行数
row_affect, err := result.RowsAffected()
if err != nil {fmt.Println("受影响行数获取失败:", err)return
}
fmt.Println("受影响的行数:", row_affect)
fmt.Println("更新成功")

执行结果

Mysql

删除数据

删除数据用的还是Exec

代码

//删除数据
sqlStr := "delete from userinfo where id = ?;"
result, err := db.Exec(sqlStr, 3)
if err != nil {fmt.Println("删除失败", err)return
}
//受影响的行数
row_affect, err := result.RowsAffected()
if err != nil {fmt.Println("受影响行数获取失败:", err)return
}
fmt.Println("受影响的行数:", row_affect)
fmt.Println("删除成功")

执行结果

Mysql

事物

事物,这个用的就比较多了,通常用在关键的场景

尤其是转账,张三-10块,李四+10块,这个动作动作是要在一起完成的。

如果任何一个失败了,就要恢复上一次的状态。

我们通常也叫这个操作叫做原子操作要成功,都成功,要完蛋,都完蛋

新建表

CREATE TABLE `bill` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(8) NOT NULL,`money` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

表数据

张三和李四都剩余100块

Go Mysql 关于事物相关方法

Go 关于事物有三个方法

  • Begin()开始事物。

  • Commit()提交事物。

  • Rollback()失败回滚。

模拟转账:张三-10块,李四+十块

代码

func main() {//事物//开启事物tx, err := db.Begin()if err != nil {//释放事物if tx != nil {tx.Rollback()}fmt.Println("事物开启失败")return
}张三减10块Sql := `UPDATE bill set money=money - 10 where name = ?;`result, err := tx.Exec(张三减10块Sql, "张三")if err != nil {//有错误表示更是失败,回滚原来状态tx.Rollback()fmt.Println(err)return
}张三受影响行数, err := result.RowsAffected()if err != nil {tx.Rollback() // 回滚return
}李四加10块Sql := `UPDATE bill set money=money + 10 where name = ?;`result, err = tx.Exec(李四加10块Sql, "李四")if err != nil {//有错误表示更是失败,回滚原来状态tx.Rollback()fmt.Println(err)return
}李四受影响行数, err := result.RowsAffected()if err != nil {tx.Rollback() // 回滚return
}//都等于1表示成功,可以提交事务,修改数据if 张三受影响行数==1 && 李四受影响行数==1{//提交事务fmt.Println("提交事务")tx.Commit()}else{//有一个!=1表示没有更新成功,可能用户不存在fmt.Println("失败了,事物回滚了")tx.Rollback()
}fmt.Println("事物执行成功")
}

执行结果

Mysql

一加一减

假如出错了

Mysql

如果使用事物,出错了数据还是没变。

总结

本次主要讲述了Go如何操作Mysql,如何进行增删改查,最后还讲了以下什么是事物,如何操作事物

当然,这种是最原始的方法,过程有些繁琐,了解入门就好,后面还有更方便的方法。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

------------------- End -------------------

Go语言操作MySQL的基础知识相关推荐

  1. Mysql的基础知识

    ##MySQL数据库基础知识1.数据库系统(database system)数据库系统是计算机系统中一种专门管理数组资源的系统,数据库存储的是一组或多组经过处理后的数据,管理这个数据库的软件成为数据库 ...

  2. 【笔记】——MySQL数据库——基础知识-——快速回顾——(加深印象篇)

    文章目录 前言 一.MySQL是什么? 二.数据库的常见概念 三.数据库存储数据的特点 四.SQL语言的分类 1.)DML 2.)DDL 3.)DCL 五.数据库的基本操作 5.1.)创建数据库 5. ...

  3. 使用C语言访问MySQL数据库基础

    使用C语言访问MySQL数据库基础 一.MySQL管理 包含在MySQL发行版中的一些有用的工具程序使管理工作变得相当容易. 除mysqlshow命令以外,所有的MySQL命令都接受所示的3个标准参数 ...

  4. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  5. 那些值得回味的MySQL的基础知识

    那些值得回味的MySQL的基础知识 MySQL零碎知识点整理 题记: 在如今甚是流行的MySQL中有些基础的知识却是我们日常工作中处理问题容易忘却的一部分,所以不能忘了本,那么我们现在就去回忆那些曾经 ...

  6. 1.0 MySQL数据库基础知识

    MySQL数据库基础知识 MYSQL介绍 MySQL分支版本的发展 MySQL. Oracle. SQLServer的市场区别 MYSQL数据库使用上的结构 MYSQL体系架构图 MYSQL体系架构- ...

  7. c语言连接mysql(入门)_MySQL入门之C语言操作MySQL

    基本概念 C APIs包含在mysqlclient库文件当中,与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询.#include #include #include #include # ...

  8. go语言mysql操作_使用Go语言操作MySQL数据库的思路与步骤

    最近在做注册登录服务时,学习用Go语言操作MySQL数据库实现用户数据的增删改查,现将个人学习心得总结如下,另外附有代码仓库地址,欢迎各位有兴趣的fork. 软件环境:Goland.Navicat f ...

  9. golang mysql curd_Go 语言操作 MySQL 之 CURD 操作

    本文转载于SegmentFault社区 作者:Meng小羽 MySQL 是目前开发中最常见的关系型数据库,使用 Go 语言进行操控数据库需要使用 Go 自带database/sql和驱动go-sql- ...

最新文章

  1. BZOJ 1552/1506 [Cerc2007]robotic sort
  2. Shiro————会话管理
  3. php冒泡 插入选择 排序,说说PHP数组的三种排序(冒泡/选择/插入)方法
  4. 计算机显示技术发展,显示技术
  5. 《推荐系统笔记(四)》svd的python计算实例
  6. React 毁了 Web 开发?
  7. python redis pipeline 堆积_Redis Pipeline python
  8. android 悬浮按钮 功能实现,Android自定义悬浮按钮效果实现,带移动效果
  9. 智能优化算法:金枪鱼群优化算法-附代码
  10. 在屏幕中间分别显示绿色、绿低红色、白底蓝色的字符串'welcome to masm!'
  11. html如何设置hr 标签的线条粗细,html中hr怎么设置粗细
  12. 需求分析报告和需求规格说明书有什么区别?
  13. Java线程状态分析/线程状态转换图
  14. 零基础搭建完全免费个人静态博客
  15. 服务器台式机装win7系统,服务器主机装win7系统安装
  16. IDLE Help | 汉化
  17. Hypervisor 技术的演进
  18. [转载] 晓说——第17期:揭秘战争秘闻 朝鲜战争62年祭(下)
  19. Error:1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL
  20. DDR扫盲——DDR与DDR2、DDR3的区别

热门文章

  1. python开发学习记录
  2. 25马5跑道,求最快的五匹马的需要比赛的次数
  3. 比特币、以太坊、瑞波币、万融链和区块链
  4. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接...
  5. GNU make manual 翻译( 一百一十一)
  6. subsonic 配置及使用
  7. 分布式事务 - 梁飞的博客 - ITeye博客
  8. 必须知道的app测试与web测试的区别
  9. leetCode 204. Count Primes 哈希 求素数
  10. Poj(3615),Floyd,最大值中的最小值