📅  最后修改于: 2023-12-03 15:08:43.277000             🧑  作者: Mango
MySQL 是一个流行的关系型数据库管理系统,而 Go 是一种主要用于构建高效网络服务和分布式系统的编程语言。在 Go 中,我们可以使用许多可用的库和包,以简单的方式来连接 MySQL 数据库,无论是使用 MySQL 的原生驱动程序,还是使用 SQL 库。
要连接 MySQL 数据库,我们需要使用 MySQL 的驱动程序包。Go 官方提供了可以在 Go 代码中直接使用的 MySQL 驱动程序包,我们可以使用 go get 命令从 Go 中下载安装它。
go get -u github.com/go-sql-driver/mysql
此外,我们还需要导入此包并使用它。下面是一个连接到 MySQL 数据库并查询数据的示例代码:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
panic(err.Error())
}
defer db.Close()
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
panic(err.Error())
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
panic(err.Error())
}
fmt.Println(id, name)
}
err = rows.Err()
if err != nil {
panic(err.Error())
}
}
在这个例子中,我们将本地 MySQL 数据库的用户名、密码和数据库名称传递给 sql.Open 函数来建立与数据库的连接。我们使用 db.Query 函数查询 users 表并遍历结果集。
我们可以使用 db.Query 函数来执行查询语句,并返回一个 *sql.Rows 对象。该对象提供了一种迭代结果集行的方法,即 rows.Next,我们使用 Scan 函数从每一行中提取需要的数据。为了及时回收连接池的连接,我们需要在遍历完成后关闭结果集和数据库连接。
除了查询,我们还可以使用 db.Exec 函数来执行更新和删除操作。Exec 函数返回一个 sql.Result 对象,可以访问受影响的行数、自增 ID 等信息。下面是一个示例代码:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
panic(err.Error())
}
defer db.Close()
result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", "New Name", 1)
if err != nil {
panic(err.Error())
}
rowsAffected, err := result.RowsAffected()
if err != nil {
panic(err.Error())
}
lastInsertID, err := result.LastInsertId()
if err != nil {
panic(err.Error())
}
fmt.Println("Rows affected:", rowsAffected)
fmt.Println("Last inserted ID:", lastInsertID)
}
在这个例子中,我们使用 db.Exec 函数更新 users 表中 id=1 的记录。我们还使用 result.RowsAffected 和 result.LastInsertId 函数获取修改的行数和最后插入的自增 ID。
通过使用 MySQL 驱动程序包和 Go,我们可以很容易地连接到 MySQL 数据库,执行查询和更新操作,并从结果集中提取所需的数据。我们还可以使用其他库和包,例如 orm 库,添加更高级的功能来帮助简化我们的代码。但务必要小心避免 SQL 注入攻击,如需动态构建 SQL 语句,应使用 ? 占位符或转义特殊字符。