文章目录

  • 一 准备数据库和表
  • 二 安装配置mysql驱动
  • 三 获得数据库连接
    • 3.1 导入包
    • 3.2 获得连接
    • 3.3 初始化连接
  • 四 插入数据
  • 五 查询数据
    • 5.1 单行查询
    • 5.2 多行查询
  • 六 更新数据
  • 七 删除数据

一 准备数据库和表

创建一个go_db数据库

create database go_db;

打开数据库

use go_db;

创建表

 create table user_tb1(id integer primary key auto_increment,username varchar(20),password varchar(20));

添加模拟数据

insert into user_tb1(username,password) value("psych","666");
insert into user_tb1(username,password) value("tom","123");
insert into user_tb1(username,password) value("kitte","456");

详细过程:

C:\Users\Mechrevo>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create database go_db;
Query OK, 1 row affected (0.44 sec)mysql> use go_db;
Database changedmysql> create table user_tb1(id integer primary key auto_increment,username varchar(20),password varchar(20));
Query OK, 0 rows affected (1.10 sec)mysql> desc user_tb1;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
| password | varchar(20) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.23 sec)mysql> insert into user_tb1(username,password) value("psych","666");
Query OK, 1 row affected (0.47 sec)mysql> insert into user_tb1(username,password) value("tom","123");
Query OK, 1 row affected (0.17 sec)mysql> insert into user_tb1(username,password) value("kitte","456");
Query OK, 1 row affected (0.09 sec)mysql> select * from user_tb1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | psych    | 666      |
|  2 | tom      | 123      |
|  3 | kitte    | 456      |
+----+----------+----------+
3 rows in set (0.03 sec)mysql>

二 安装配置mysql驱动

安装驱动

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

初始化模块

go mod init m

执行go mod tidy

go mod tidy

导入驱动(官方示例https://pkg.go.dev/github.com/go-sql-driver/mysql@v1.6.0#section-readme)

package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql"
)func main() {// ...db, err := sql.Open("mysql", "user:password@/dbname")if err != nil {panic(err)}// See "Important settings" section.db.SetConnMaxLifetime(time.Minute * 3)db.SetMaxOpenConns(10)db.SetMaxIdleConns(10)
}

三 获得数据库连接

3.1 导入包

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

3.2 获得连接

package mainimport ("database/sql""fmt""time"_ "github.com/go-sql-driver/mysql"
)// ...
func main() {db, err := sql.Open("mysql", "root:960690@/go_db")if err != nil {panic(err)}// 设置最大连接时长db.SetConnMaxLifetime(time.Minute * 3)// 设置最大连接数db.SetMaxOpenConns(10)// 设置空闲连接数db.SetMaxIdleConns(10)fmt.Printf("db:%v\n", db)}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
db:&{0 0xc000006028 0 {0 0} [] map[] 0 0 0xc00005c0c0 false map[] map[] 10 10 180000000000 0 <nil> 0 0 0 0 0x54a100}[Done] exited with code=0 in 2.423 seconds

3.3 初始化连接

Open函数只是验证格式是否正确,实际上并不是创建数据库连接。如果要检查数据源的名称是否真实有效,应该调用Ping方法。

返回的DB对象可以安全地被多个协程并发使用,并且维护其自己的空闲连接池。因此Open函数应该仅被调用一次,很少需要关闭这个DB对象。

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {// dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True"dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)// 注意!!!这里不要使用:= 我们是给全局变量赋值,然后在main函数中使用全局变量db// open函数只是验证格式是否正确,不会校验账号密码是否正确,并不是创建数据库连接if err != nil {return err}// 尝试与数据库建立连接,即校验dsn是否正确err2 := db.Ping()if err2 != nil {return err2}return nil
}func main() {err := initDB() // 调用初始化数据库的函数if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("连接成功")}fmt.Printf("db: %v\n", db)
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
连接成功
db: &{0 0xc000006028 0 {0 0} [0xc00012e000] map[] 0 1 0xc00005c0c0 false map[0xc00012e000:map[0xc00012e000:true]] map[] 0 0 0 0 <nil> 0 0 0 0 0x30a5a0}[Done] exited with code=0 in 1.869 seconds

四 插入数据

使用Exec方法

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

实例演示1:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}// 插入数据
func insertData() {sqlStr := "insert into user_tb1(username,password) values (?,?)"ret, err := db.Exec(sqlStr, "Klee", "boomboomboom")if err != nil {fmt.Println("insert err = ", err)return}theId, err := ret.LastInsertId() // 新插入的数据idif err != nil {fmt.Println("get LastInsertId err = ", err)return}fmt.Printf("插入成功,id是: %d.\n", theId)
}func main() {err := initDB() // 调用初始化数据库的函数if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}insertData()
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
插入成功,id是: 4.[Done] exited with code=0 in 1.657 seconds

数据库查看:

实例演示2:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}// 插入数据func insertData2(username string, password string) {sqlStr := "insert into user_tb1(username,password) values (?,?)"ret, err := db.Exec(sqlStr, username, password)if err != nil {fmt.Println("insert err = ", err)return}theId, err := ret.LastInsertId() // 新插入的数据idif err != nil {fmt.Println("get LastInsertId err = ", err)return}fmt.Printf("插入成功,id是: %d.\n", theId)
}func main() {err := initDB() // 调用初始化数据库的函数if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}insertData2("Morax", "yanwangdijun")
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
插入成功,id是: 6.[Done] exited with code=0 in 1.673 seconds

数据库查看:

五 查询数据

5.1 单行查询

db.QueryRow()执行一次查询,并期望返回最多一行结果。

QueryRow总是返回非nil的值,知道返回值的Scan方法被调用时,才会返回延迟的错误。

func (db *DB) QueryRow(query string, args ...any) *Row

先定义一个结构体:

type user struct {id       intusername stringpassword string
}

实例演示:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}type user struct {id       intusername stringpassword string
}func queryRowData() {sqlStr := "select Id,username,password from user_tb1 where id=?"var u usererr := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.username, &u.password)if err != nil {fmt.Printf("err: %v\n", err)return}fmt.Printf("Id:%d username:%v password:%v \n", u.id, u.username, u.password)
}func main() {err := initDB() // 初始化数据库if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}queryRowData()
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
Id:1 username:psych password:666 [Done] exited with code=0 in 1.756 seconds

5.2 多行查询

db.Query()执行一次查询,返回多行结果,一般用于执行select命令。

参数args表示query中的占位参数。

func (db *DB) Query(query string, args ...any) (*Rows, error)

实例演示:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}type user struct {id       intusername stringpassword string
}func queryManyData() {sqlStr := "select Id,username,password from user_tb1 where id > ?"r, err := db.Query(sqlStr, 2)if err != nil {fmt.Printf("err: %v\n", err)return}defer r.Close()   // 非常重要!!!关闭r释放持有的数据库连接// 循环读取结果集中的数据for r.Next() {var u usererr2 := r.Scan(&u.id, &u.username, &u.password)if err2 != nil {fmt.Printf("err2: %v\n", err2)return}fmt.Printf("Id:%d username:%v password:%v\n", u.id, u.username, u.password)}
}func main() {err := initDB() // 初始化数据库if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}queryManyData()
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
Id:3 username:kitte password:456
Id:4 username:Klee password:boomboomboom
Id:6 username:Morax password:yanwangdijun[Done] exited with code=0 in 2.055 seconds

六 更新数据

使用Exec方法

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

实例演示:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}func updateData() {sql := "update user_tb1 set username=?,password=? where id=?"ret, err := db.Exec(sql, "baal", "leishen", "3")if err != nil {fmt.Println("更新失败,err = ", err)return}rows, err := ret.RowsAffected()if err != nil {fmt.Println("更新行 失败,err = ", err)return}fmt.Printf("更新成功,更新行数: %d.\n", rows)
}func main() {err := initDB() // 初始化数据库if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}updateData()
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
更新成功,更新行数: 1.[Done] exited with code=0 in 2.021 seconds

数据库查看:

七 删除数据

使用Exec方法

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

实例演示:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {dsn := "root:960690@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4"db, err = sql.Open("mysql", dsn)if err != nil {return err}err2 := db.Ping()if err2 != nil {return err2}return nil
}func delData() {sql := "delete from user_tb1 where id=?"ret, err := db.Exec(sql, "2")if err != nil {fmt.Println("删除失败 err = ", err)return}rows, err := ret.RowsAffected()if err != nil {fmt.Println("删除行失败 err = ", err)return}fmt.Printf("删除成功,删除的行数: %d.\n", rows)
}func main() {err := initDB() // 初始化数据库if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Println("数据库go_db连接成功")}delData()
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\test.go"
数据库go_db连接成功
删除成功,删除的行数: 1.[Done] exited with code=0 in 1.805 seconds

数据库查看:

Go语言学习笔记—golang操作MySQL数据库相关推荐

  1. mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/s ...

  2. go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

    go语言学习第八天==>mysql数据库增删改查.用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求 引包 import的 ...

  3. 封装一个自己的golang操作MySQL数据库工具

    封装一个自己的golang操作MySQL数据库工具 准备工作 导入驱动 连接mysql 增删改查 增 删 改 查 准备工作 首先我们要准备一个写golang的IDE,我用的是goland,还可以用vs ...

  4. C#学习笔记----C#连接MySQL数据库

    C#学习笔记----C#连接MySQL数据库 using System.Linq; using System.Text; using System.Data;// 引用表的命名空间 using Sys ...

  5. Go语言学习笔记—golang基础语法

    视频来源:B站<golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!]> 文章为自己整理的学习笔记,侵权即删,谢谢支持! 文章目录 golang基础语法 一.gola ...

  6. Go语言学习笔记—golang基础简介

    视频来源:B站<golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!]> 文章为自己整理的学习笔记,侵权即删,谢谢支持! 文章目录 一.Go语言简述 二.Go语言特点 ...

  7. python mysqldb_python学习-使用MySQLdb操作mysql数据库

    操作环境为python2.7 centos7 一.MySQLdb的安装与配置 MySQLdb是用于Python连接mysql数据库的接口,它实现了Python数据库api规范2.0. 按照以下方式安装 ...

  8. 1899-11-30 php mysql_PHP学习十一--PHP操作MYSQL数据库

    1.PHP访问Mysql数据库的一般步骤 连接MySQL服务器 选择MySQL数据库 请求               执行SQL语句                        请求 MySQL数 ...

  9. jmeter+mysql+set_jmeter学习指南之操作 mysql 数据库

    JMeter 通过 JDBC Connection Configuration 和 JDBC Request 可以连接数据库,并进行增删改查操作,支持各种常见的数据库,本文以最常用的 MySQL 数据 ...

最新文章

  1. Android通过ShareSDK实现新浪微博分享
  2. ROS Master IP
  3. Runtime.exec 调用OS命令特例
  4. 定位技术GPS/A-GPS/LBS/WIFI定位介绍
  5. c++指针引用导出文件
  6. Android 那些你所不知道的Bitmap对象详解
  7. JavaScript 是传值调用还是传引用调用?
  8. 批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术
  9. 数据驱动创新 融合引领变革 2017中国工业大数据大会·钱塘峰会今日在杭州国际博览中心顺利举行...
  10. android游戏开发框架libgdx的使用(十五)—TWL布局
  11. 转贴:从现在电力短缺看今后劳动力短缺和高校破产
  12. wps 云服务器登录_WPS云服务使用协议
  13. iOS 中高级面试题(附答案)
  14. 怎么缩小照片的kb,压缩照片大小方法
  15. 网络学习笔记之路由器基本命令行操作
  16. gitbook踩坑指南-无法转pdf、epub等;pdf调字体大小
  17. 500台网吧设计方案实验--基于华为模拟器
  18. 富有哲理的12条大数据金句
  19. JavaScript(第四天)—爱创课堂专业前端培训
  20. acer台式电脑怎么重装系统_宏基台式电脑怎么装系统

热门文章

  1. 【BZOJ1061】【NOI2008】志愿者招募
  2. nsis 检测vcredist_x86是否安装
  3. redash源码部署
  4. 2020年无盘服务器配置,2020年想新开网咖?网咖电脑配置回复给你了好好收着
  5. 2013年5月18日北京园博园之旅
  6. 引领自主突围,睿赛德科技正式杀入车载OS赛道
  7. 两种服务器机柜的冷却解决方案
  8. 利用Python将WEBVTT格式的视频字幕文件转为SRT格式
  9. 冰箱,已经给不了北京人民安全感了
  10. virtualbox给虚拟机配置host-only网络