引言
在上一篇文章中,我们成功连接了 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")}
复制代码
运行该程序:
再来查看我们的数据库表 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 实际上准备、执行和关闭准备好的语句。
执行该代码:
在 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 语句的写法,然后代码框架差不多,也可以把这些函数封装成一个工具,方便今后自己的使用 。本篇文章就到此结束了,下一篇文章再见~
评论