引言
在上一篇文章中,我们成功连接了 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 names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------+
| Tables_in_db_test |
+-------------------+
| table_name |
+-------------------+
1 row in set (0.00 sec)
编写的 Go 语言的代码如下:
package main
import (
"database/sql"
"fmt"
_ "/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"
_ "/go-sql-driver/mysql"
"log"
)
func main() {
db, err := sql.Open("mysql", )
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"
_ "/go-sql-driver/mysql"
"log"
)
func main() {
db, err := sql.Open("mysql", ")
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: Wade
Id: 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"
_ "/go-sql-driver/mysql"
"log"
)
func main() {
db, err := sql.Open("mysql", )
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"
_ "/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"
_ "/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 语句的写法,然后代码框架差不多,也可以把这些函数封装成一个工具,方便今后自己的使用 。