写点什么

Go 语言入门很简单:Go 语言中操作 MySQL 数据库

作者:宇宙之一粟
  • 2022 年 5 月 10 日
  • 本文字数:2949 字

    阅读完需:约 10 分钟

Go 语言入门很简单:Go 语言中操作 MySQL 数据库

引言

在上一篇文章中,我们成功连接了 MySQL 数据库,并成功打印出 MySQL 的版本号,本篇文章就来介绍如何使用 Go 语言操作数据库。

创建数据库表

我们在 DB_TEST 数据库中新建一个 user 数据库,包含主键 id 和名字 name,可以使用如下语句:

_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
复制代码


我们可以先在 MySQL 终端中查看我们的数据库表。

mysql> use DB_TEST;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedmysql> show tables;+-------------------+| Tables_in_db_test |+-------------------+| table_name |+-------------------+1 row in set (0.00 sec)
复制代码


编写的 Go 语言的代码如下:

package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") 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.Print("Successfully Created\n")}
复制代码

运行该程序:

Successfully Created
复制代码


再来查看我们的数据库表 show tables;,会看到多了一个 user 表,说明创建数据库表成功:

mysql> show tables;+-------------------+| Tables_in_db_test |+-------------------+| table_name        || user              |+-------------------+2 rows in set (0.01 sec)
复制代码

插入数据


package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") log.Fatalln(err) }
_, err2 := db.Query("INSERT INTO user VALUES(1, 'Wade')") if err2 != nil { log.Fatal(err2) }
fmt.Print("Successfully Inserted\n")}
复制代码


回到数据库终端,查看一下 user 表 select * from user;,可以看到我们刚刚插入成功的一条数据:

mysql> select * from user;+----+------+| id | name |+----+------+|  1 | Wade |+----+------+1 row in set (0.00 sec)
复制代码

查询所有数据


我们在数据库中再插入一条数据,使用如下命令 INSERT INTO user VALUES(2, 'Kyrie');

mysql> INSERT INTO user VALUES(2, 'Kyrie');Query OK, 1 row affected (0.00 sec)
复制代码

然后使用 db.Query("SELECT * FROM user") 查询 user 数据库表中的所有数据:

package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") log.Fatalln(err) }
result, err2 := db.Query("SELECT * FROM user") if err2 != nil { log.Fatal(err2) }
for result.Next() {
var id int var name string
err = result.Scan(&id, &name)
if err != nil { panic(err) }
fmt.Printf("Id: %d, Name: %s\n", id, name) }}
复制代码

执行结果:

Id: 1, Name: WadeId: 2, Name: Kyrie
复制代码


条件查询

可以使用 db.Query("SELECT * FROM user WHERE id = ?", mid) 进行条件查询:

result, err2 := db.Query("SELECT * FROM user WHERE id = ?", mid)
复制代码

Go 代码如下:

package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") 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) }}
复制代码

是一个占位符,填充了 mid 变量中的值。在后台,db.Query 实际上准备、执行和关闭准备好的语句。

执行该代码:

Id: 1, Name: Wade
复制代码

在 MySQL 终端中运行:

mysql> SELECT * FROM user WHERE id = 1;+----+------+| id | name |+----+------+|  1 | Wade |+----+------+1 row in set (0.00 sec)
复制代码


删除数据

RowsAffected 返回受更新、插入或删除语句影响的行数。


在代码示例中,我们使用 DELETE SQL 语句删除一条数据。然后我们用 RowsAffected 打印删除的行数。


package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") 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("The statement affected %d rows\n", affectedRows)}
复制代码


The statement affected 1 rows
复制代码

此时,再回到 MySQL 终端查看:

mysql> SELECT * FROM user;+----+-------+| id | name  |+----+-------+|  2 | Kyrie |+----+-------+1 row in set (0.00 sec)
复制代码

修改数据


package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log")
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() defer db.Close()
if err != nil { fmt.Println("数据库连接失败!") log.Fatalln(err) }
sql := "update user set name = ? WHERE id = ?" res, err2 := db.Exec(sql, "Yuzhou1su", 2)
if err2 != nil { panic(err2.Error()) }
affectedRows, err := res.RowsAffected()
if err != nil { log.Fatal(err) }
fmt.Printf("Update Success, The statement affected %d rows\n", affectedRows)}
复制代码

运行结果:

Update Success, The statement affected 1 rows
复制代码

可以看到 id = 2 的数据 name 修改为 Yuzhou1su ,数据库中验证:

mysql> SELECT * FROM user;+----+-----------+| id | name      |+----+-----------+|  2 | Yuzhou1su |+----+-----------+1 row in set (0.01 sec)
复制代码

总结

本文介绍了 Go 语言如何进行增删改查,可以看到增删改查的代码并不复杂,最主要就是掌握 MySQL 的 SQL 语句的写法,然后代码框架差不多,也可以把这些函数封装成一个工具,方便今后自己的使用 。本篇文章就到此结束了,下一篇文章再见~

发布于: 2022 年 05 月 10 日阅读数: 31
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Go 语言入门很简单:Go 语言中操作 MySQL 数据库_Go 语言_宇宙之一粟_InfoQ写作社区