Go语言操作MySQL数据库(非常详细)
在使用 Go 语言操作 MySQL 数据库之前,要编写如下代码向 Go 程序导入 go-mysql 驱动程序:
在与 MySQL 数据库建立连接后,需调用 sql 包中的 Open() 函数创建一个数据库对象。代码如下:
调用 sql 包中的 Open() 函数,打开由其数据库驱动程序名称和驱动程序特定数据源名称指定的数据库,通常至少由数据库名称和连接信息组成。
这行代码既不与 MySQL 数据库建立任何连接,也不验证 go-mysql 驱动程序的连接参数,而是创建一个数据库对象。
在掌握了上述内容后,下面介绍如何使用 Go 语言操作 MySQL 数据库。
【实例】查询 MySQL 数据库的版本号。通过 CREATE DATABASE 语句创建一个名为 db_test 的数据库,代码如下:
在创建数据库 db_test 后,首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着使用指定命令通过单行查询的方式查询 MySQL 数据库的版本号,最后关闭数据库并将 MySQL 数据库的版本号打印在控制台上。代码如下:
如果使用 Go 语言实现,那么除了要使用上述的 SQL 语句,还要通过数据库对象调用 Exec() 函数执行 SQL 语句。代码如下:
【实例】在数据库 db_test 中新建数据表 user。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行用于新建数据表的 SQL 语句,最后关闭数据库并将“已成功新建数据表 user!”的提示信息打印在控制台上。代码如下:
启动 MySQL 服务器,输入下面的 SQL 语句,即可查看数据库 db_test 中的数据表 user:
【实例】向数据表 user 插入一条数据。编写一个程序,首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Query() 函数执行用于向数据表 user 插入一条数据的 SQL 语句,最后关闭数据库并将“已成功向数据表user插入数据!”的提示信息打印在控制台上。代码如下:
启动 MySQL 服务器,输入下面的 SQL 语句,即可查看数据表 user 中的数据:
【实例】查询数据表user中的所有数据。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Query() 函数分别执行向数据表 user 插入一条数据的 SQL 语句和查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
如果想把 Leon 修改为“张三”,除了要使用修改 name 的值的 SQL 语句,还要通过数据库对象调用 Exec() 函数以执行 SQL 语句。代码如下:
【实例】把数据表 user 中的 Leon 修改为“张三”。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行把数据表 user 中的 Leon 修改为“张三”的 SQL 语句,再调用 Query() 函数执行查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
【实例】根据 id 删除用户。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行根据 id 删除用户的 SQL 语句,再调用 Query() 函数执行查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
_ "github.com/go-sql-driver/mysql"当导入带有空白标识符前缀“_”的包时,将调用包的 init() 函数,以注册 go-mysql 驱动程序。
在与 MySQL 数据库建立连接后,需调用 sql 包中的 Open() 函数创建一个数据库对象。代码如下:
db, err := sql.Open("mysql", "<user>:<password>@tcp(127.0.0.1:3306)/<database-name>")参数说明如下:
- user:MySQL 数据库的用户名;
- password:MySQL 数据库的密码;
- database-name:自定义数据库的名称。
调用 sql 包中的 Open() 函数,打开由其数据库驱动程序名称和驱动程序特定数据源名称指定的数据库,通常至少由数据库名称和连接信息组成。
这行代码既不与 MySQL 数据库建立任何连接,也不验证 go-mysql 驱动程序的连接参数,而是创建一个数据库对象。
在掌握了上述内容后,下面介绍如何使用 Go 语言操作 MySQL 数据库。
Go语言连接MySQL数据库
启动 MySQL 服务器,并使用如下 SQL 语句查询 MySQL 数据库的版本号:SELECT VERSION();在使用 Go 语言时,除了使用上述 SQL 语句,还要通过数据库对象调用 QueryRow() 函数以实现单行查询。代码如下:
err2 := db.QueryRow("SELECT VERSION()").Scan(&version)
【实例】查询 MySQL 数据库的版本号。通过 CREATE DATABASE 语句创建一个名为 db_test 的数据库,代码如下:
create database db_test;执行结果为:
mysql> create database db_test; Query OK, 1 row affected (0.09 sec) mysql>
在创建数据库 db_test 后,首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着使用指定命令通过单行查询的方式查询 MySQL 数据库的版本号,最后关闭数据库并将 MySQL 数据库的版本号打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatalln(err) } var version string //声明 MySQL 数据库的版本 err2 := db.QueryRow("SELECT VERSION()").Scan(&version) //单行查询 if err2 != nil { log.Fatal(err2) } fmt.Println(version) //打印 MySQL 数据库的版本 }运行结果如下:
8.0.32
Go语言新建数据表
在数据库 db_test 中新建数据表 user。在数据表 user 中,包含主键 id 和用户的名字 name。为了实现上述操作,可以使用如下的 SQL 语句:CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));
如果使用 Go 语言实现,那么除了要使用上述的 SQL 语句,还要通过数据库对象调用 Exec() 函数执行 SQL 语句。代码如下:
_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
【实例】在数据库 db_test 中新建数据表 user。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行用于新建数据表的 SQL 语句,最后关闭数据库并将“已成功新建数据表 user!”的提示信息打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") //注意:DB_TEST 大写 db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatal(err) } //执行 SQL 语句 _, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));") if err2 != nil { log.Fatal(err2) } fmt.Println("已成功新建数据表 user! \n") //新建数据表,打印提示信息 }运行结果如下:
已成功新建数据表user!
启动 MySQL 服务器,输入下面的 SQL 语句,即可查看数据库 db_test 中的数据表 user:
mysql> use DB_TEST; Database changed mysql> show tables; +------------------+ | Tables_in_db_test| +------------------+ | tb_test | | user | +------------------+ 2 rows in set (0.00 sec)
Go语言插入数据
向数据表 user 插入一条数据。其中,id 的值为 1,name 的值为 David。为了实现上述操作,可以使用如下的 SQL 语句:INSERT INTO user VALUES(1, 'David')如果使用 Go 语言实现,那么除了要使用上述的 SQL 语句,还要通过数据库对象调用 Query() 函数并执行 SQL 语句。代码如下:
_, err2 := db.Query("INSERT INTO user VALUES(1, 'David')")
【实例】向数据表 user 插入一条数据。编写一个程序,首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Query() 函数执行用于向数据表 user 插入一条数据的 SQL 语句,最后关闭数据库并将“已成功向数据表user插入数据!”的提示信息打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建一个数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatal(err) } _, err2 := db.Query("INSERT INTO user VALUES(1,'David')") if err2 != nil { log.Fatal(err2) } fmt.Println("已成功向数据表 user 插入数据!\n") //插入数据后,打印提示信息 }运行结果如下:
已成功向数据表user插入数据!
启动 MySQL 服务器,输入下面的 SQL 语句,即可查看数据表 user 中的数据:
mysql> use DB_TEST; Database changed mysql> show tables; +------------------+ | Tables_in_db_test| +------------------+ | tb_test | | user | +------------------+ 2 rows in set (0.00 sec) mysql> select * from user; +----+-------------+ | id | name | +----+-------------+ | 1 | David | +----+-------------+ 1 row in set (0.00 sec)
Go语言查询数据
由上述的 SQL 语句可知,使用 SQL 语句(select * from user;)可以查询数据表 user 中的所有数据。如果使用 Go 语言实现,那么除了要使用上述 SQL 语句,还要通过数据库对象调用 Query() 函数以执行 SQL 语句。代码如下:result, err3 := db.Query("SELECT * FROM user")
【实例】查询数据表user中的所有数据。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Query() 函数分别执行向数据表 user 插入一条数据的 SQL 语句和查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatal(err) } //插入一条数据 _, err2 := db.Query("INSERT INTO user VALUES(2, 'Leon')") if err2 != nil { log.Fatal(err2) } //查询数据表 user 中的所有数据 result, err3 := db.Query("SELECT * FROM user") if err3 != nil { log.Fatal(err2) } //遍历查询的结果 for result.Next() { var id int //主键 id 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: David
id: 2, name: Leon
Go语言修改数据
在上面的实例中,向数据表 user 插入第二条数据。其中,id 的值为 2,name 的值为 Leon。如果想把 Leon 修改为“张三”,除了要使用修改 name 的值的 SQL 语句,还要通过数据库对象调用 Exec() 函数以执行 SQL 语句。代码如下:
sql := "update user set name = ? WHERE id = ?" _, err2 := db.Exec(sql, "张三", 2)
【实例】把数据表 user 中的 Leon 修改为“张三”。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行把数据表 user 中的 Leon 修改为“张三”的 SQL 语句,再调用 Query() 函数执行查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatal(err) } //修改用户名的 SQL 语句 sql := "update user set name = ? WHERE id = ?" _, err2 := db.Exec(sql, "张三", 2) if err2 != nil { panic(err2.Error()) } fmt.Println("已成功修改数据表 user 中的数据!\n") //修改数据后,打印提示信息 //查询数据表 user 中的所有数据 result, err3 := db.Query("SELECT * FROM user") if err3 != nil { log.Fatal(err2) } //遍历查询的结果 for result.Next() { var id int //主键 id var name string //用户的名字 err = result.Scan(&id, &name) if err != nil { panic(err) } fmt.Printf("id: %d, name: %s\n", id, name) } }运行结果如下:
已成功修改数据表user中的数据!
id: 1, name: David
id: 2, name: 张三
Go语言删除数据
前面实例向数据表 user 插入第一条数据。其中,id 的值为 1,name 的值为 David。如果想删除这条数据,除了要使用根据 id 删除用户的 SQL 语句,还要通过数据库对象调用 Exec() 函数以执行 SQL 语句。代码如下:sql := "DELETE FROM user WHERE id = 1" _, err2 := db.Exec(sql)
【实例】根据 id 删除用户。首先创建一个数据库对象,然后与 MySQL 数据库建立连接,接着通过数据库对象调用 Exec() 函数执行根据 id 删除用户的 SQL 语句,再调用 Query() 函数执行查询数据表 user 中的所有数据的 SQL 语句,最后使用 for 循环遍历查询的结果并将其打印在控制台上。代码如下:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { //创建数据库对象 db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/DB_TEST") db.Ping() //与数据库建立连接 defer db.Close() //延迟关闭数据库 if err != nil { fmt.Println("数据库连接失败!") log.Fatal(err) } //删除用户的 SQL 语句 sql := "DELETE FROM user WHERE id = 1" _, err2 := db.Exec(sql) if err2 != nil { panic(err2.Error()) } fmt.Println("已成功删除数据表 user 中的数据!\n") //删除数据后,打印提示信息 //查询数据表 user 中的所有数据 result, err3 := db.Query("SELECT * FROM user") if err3 != nil { log.Fatal(err2) } //遍历查询的结果 for result.Next() { var id int //主键 id var name string //用户的名字 err = result.Scan(&id, &name) if err != nil { panic(err) } fmt.Printf("id: %d, name: %s\n", id, name) } }运行结果如下:
已成功删除数据表user中的数据!
id: 2, name: 张三