Go语言操作MySql数据库的详细指南

 更新时间:2023年10月18日 15:25:24   作者:hsy12342611  
数据的持久化是程序中必不可少的,所以编程语言中对数据库的操作是非常重要的一块,这篇文章主要给大家介绍了关于Go语言操作MySql数据库的相关资料,需要的朋友可以参考下

前言

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

1.安装驱动程序

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

2.导入驱动包

_ "github.com/go-sql-driver/mysql"

说明:当导入带有空白标识符前缀 _ 的包时,将调用包的 init 函数。该函数注册驱动程序

3.操作数据库

3.1 获取mysql版本

func showMysqlVersion() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("数据库连接失败!")
		log.Fatalln(err)
	}

	var version string

	err2 := db.QueryRow("SELECT VERSION()").Scan(&version)

	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println(version)
}

3.2 创建表

func createTable() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully create table")
}

3.3 表中插入数据

func insertItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Query("INSERT INTO user VALUES(1, 'zhangsan')")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully insert item")
}

3.4 表中删除数据

func deleteItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	sql := "DELETE FROM user WHERE id = 1"
	res, err2 := db.Exec(sql)

	if err2 != nil {
		panic(err2.Error())
	}

	affectedRows, err := res.RowsAffected()

	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("delete item success, statement affected %d rows\n", affectedRows)
}

3.5 修改表中数据

func alterItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	sql := "update user set name = ? WHERE id = ?"
	res, err2 := db.Exec(sql, "lisi", 1)

	if err2 != nil {
		panic(err2.Error())
	}

	affectedRows, err := res.RowsAffected()

	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("alter item success, statement affected %d rows\n", affectedRows)
}

3.6 查询表中数据

func queryItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	var mid int = 1

	result, err2 := db.Query("SELECT * FROM user WHERE id = ?", mid)
	if err2 != nil {
		log.Fatal(err2)
	}

	for result.Next() {

		var id int
		var name string

		err = result.Scan(&id, &name)

		if err != nil {
			log.Fatal(err)
		}

		fmt.Printf("id: %d, name: %s\n", id, name)
	}
}

3.7 删除表

func dropTable() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Exec("DROP TABLE user;")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully drop table")
}

4.综合演示

完整代码如下:

package main

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

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

func showMysqlVersion() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("数据库连接失败!")
		log.Fatalln(err)
	}

	var version string

	err2 := db.QueryRow("SELECT VERSION()").Scan(&version)

	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println(version)
}

func createTable() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully create table")
}

func insertItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Query("INSERT INTO user VALUES(1, 'zhangsan')")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully insert item")
}

func deleteItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	sql := "DELETE FROM user WHERE id = 1"
	res, err2 := db.Exec(sql)

	if err2 != nil {
		panic(err2.Error())
	}

	affectedRows, err := res.RowsAffected()

	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("delete item success, statement affected %d rows\n", affectedRows)
}

func alterItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	sql := "update user set name = ? WHERE id = ?"
	res, err2 := db.Exec(sql, "lisi", 1)

	if err2 != nil {
		panic(err2.Error())
	}

	affectedRows, err := res.RowsAffected()

	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("alter item success, statement affected %d rows\n", affectedRows)
}

func queryItem() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	var mid int = 1

	result, err2 := db.Query("SELECT * FROM user WHERE id = ?", mid)
	if err2 != nil {
		log.Fatal(err2)
	}

	for result.Next() {

		var id int
		var name string

		err = result.Scan(&id, &name)

		if err != nil {
			log.Fatal(err)
		}

		fmt.Printf("id: %d, name: %s\n", id, name)
	}
}

func dropTable() {
	db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
	db.Ping()
	defer db.Close()

	if err != nil {
		fmt.Println("connect DB error !")
		log.Fatalln(err)
	}

	_, err2 := db.Exec("DROP TABLE user;")
	if err2 != nil {
		log.Fatal(err2)
	}

	fmt.Println("successfully drop table")
}

func main() {
	showMysqlVersion()
	createTable()
	insertItem()
	queryItem()
	alterItem()
	queryItem()
	deleteItem()
	dropTable()
}

运行效果:

go mod init mysql-test.go 
go build mysql-test.go 
./mysql-test 

 代码结构:

总结

到此这篇关于Go语言操作MySql数据库的文章就介绍到这了,更多相关Go操作MySql数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go学习笔记之map的声明和初始化

    Go学习笔记之map的声明和初始化

    map底层是由哈希表实现的,Go使用链地址法来解决键冲突,下面这篇文章主要给大家介绍了关于Go学习笔记之map的声明和初始化的相关资料,需要的朋友可以参考下
    2022-11-11
  • jenkins配置golang 代码工程自动发布的实现方法

    jenkins配置golang 代码工程自动发布的实现方法

    这篇文章主要介绍了jenkins配置golang 代码工程自动发布,jks是个很好的工具,使用方法也很多,我只用了它简单的功能,对jenkins配置golang相关知识感兴趣的朋友一起看看吧
    2022-07-07
  • Go语言报错:'godoc' 不是内部或外部命令,也不是可运行的程序(godoc无法使用处理)解决方法

    Go语言报错:'godoc' 不是内部或外部命令,也不是可运行的程序(godoc无法使用处理)解决

    这篇文章主要介绍了Go语言报错:'godoc' 不是内部或外部命令,也不是可运行的程序(godoc无法使用处理)解决方法,详细描述了Go语言godoc命令无法使用的原因、解决方法与相关注意事项,需要的朋友可以参考下
    2024-01-01
  • 使用golang实现一个MapReduce的示例代码

    使用golang实现一个MapReduce的示例代码

    这篇文章主要给大家介绍了关于如何使用golang实现一个MapReduce,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 使用go语言实现查找两个数组的异同操作

    使用go语言实现查找两个数组的异同操作

    这篇文章主要介绍了使用go语言实现查找两个数组的异同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言crypto包创建自己的密码加密工具实现示例

    Go语言crypto包创建自己的密码加密工具实现示例

    Go语言借助它的简单性和强大的标准库,实现一个自己的密码加密工具,本文将会结合代码示例深入探讨如何使用Go语言的crypto包来实现自己的加密工具
    2023-11-11
  • Golang空接口与类型断言的实现

    Golang空接口与类型断言的实现

    本文主要介绍了Golang空接口与类型断言的实现,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 深入了解Golang的指针用法

    深入了解Golang的指针用法

    与C语言一样,Go语言中同样有指针,通过指针,我们可以只传递变量的内存地址,而不是传递整个变量,这在一定程度上可以节省内存的占用。本文将通过示例详细讲讲Golang的指针用法,需要的可以参考一下
    2022-07-07
  • 用Go获取短信验证码的示例代码

    用Go获取短信验证码的示例代码

    要用Go获取短信验证码,通常需要连接到一个短信服务提供商的API,并通过该API发送请求来获取验证码,由于不同的短信服务提供商可能具有不同的API和授权方式,我将以一个简单的示例介绍如何使用Go语言来获取短信验证码,需要的朋友可以参考下
    2023-07-07
  • 浅谈Go语言的高效编码细节

    浅谈Go语言的高效编码细节

    这篇文章主要介绍了浅谈Go语言的高效编码细节,我们都知道golang是天生的高并发,高效的编译型语言,可我们也都可知道,工具再好,用法不对,全都白费,我们来举2个常用路径来感受一下
    2023-01-01

最新评论