Go 语言操作 MySQL 数据库增删改查示例
Go 语言,也称为 Golang,是由 Google 开发的一种静态类型、编译型、并发型编程语言。由于其简洁的语法、高效的性能和强大的并发处理能力,Go 语言在近年来受到了广泛的关注和喜爱。在数据处理方面,Go 语言同样表现出色,特别是与关系型数据库如 MySQL 的交互。本文将围绕 Go 语言操作 MySQL 数据库的增删改查(CRUD)操作,通过示例代码展示如何实现这些基本数据库操作。
环境准备
在开始之前,请确保以下环境已正确配置:
1. Go 语言环境:下载并安装 Go 语言,配置好环境变量。
2. MySQL 数据库:安装 MySQL 数据库,并创建一个用于演示的数据库和表。
3. MySQL 驱动:下载并安装 MySQL 驱动,如 `go-sql-driver/mysql`。
数据库表结构
以下是一个简单的用户信息表结构,用于演示 CRUD 操作:
sql
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
安装 MySQL 驱动
在 Go 项目中,首先需要安装 MySQL 驱动。打开终端,执行以下命令:
bash
go get -u github.com/go-sql-driver/mysql
连接 MySQL 数据库
在 Go 代码中,首先需要导入 `database/sql` 包和 `github.com/go-sql-driver/mysql` 包,然后创建一个数据库连接。
go
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 数据库连接字符串
dsn := "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MySQL database!")
}
增(Create)
以下是一个插入新用户记录的示例:
go
func createUser(db sql.DB, username, email, password string) error {
stmt, err := db.Prepare("INSERT INTO users(username, email, password) VALUES (?, ?, ?)")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(username, email, password)
return err
}
func main() {
// 连接数据库
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 插入新用户
err = createUser(db, "john_doe", "john@example.com", "password123")
if err != nil {
log.Fatal(err)
}
fmt.Println("User created successfully!")
}
删(Delete)
以下是一个删除用户记录的示例:
go
func deleteUser(db sql.DB, id int) error {
stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(id)
return err
}
func main() {
// 连接数据库
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 删除用户
err = deleteUser(db, 1)
if err != nil {
log.Fatal(err)
}
fmt.Println("User deleted successfully!")
}
改(Update)
以下是一个更新用户记录的示例:
go
func updateUser(db sql.DB, id int, username, email, password string) error {
stmt, err := db.Prepare("UPDATE users SET username = ?, email = ?, password = ? WHERE id = ?")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(username, email, password, id)
return err
}
func main() {
// 连接数据库
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 更新用户
err = updateUser(db, 1, "john_doe_updated", "john_updated@example.com", "password123_updated")
if err != nil {
log.Fatal(err)
}
fmt.Println("User updated successfully!")
}
查(Read)
以下是一个查询用户记录的示例:
go
func getUser(db sql.DB, id int) (sql.Rows, error) {
stmt, err := db.Prepare("SELECT FROM users WHERE id = ?")
if err != nil {
return nil, err
}
defer stmt.Close()
rows, err := stmt.Query(id)
if err != nil {
return nil, err
}
return rows, nil
}
func main() {
// 连接数据库
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 查询用户
rows, err := getUser(db, 1)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var user struct {
ID int
Username string
Email string
Password string
}
for rows.Next() {
if err := rows.Scan(&user.ID, &user.Username, &user.Email, &user.Password); err != nil {
log.Fatal(err)
}
fmt.Printf("User ID: %d, Username: %s, Email: %s, Password: %s", user.ID, user.Username, user.Email, user.Password)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
总结
本文通过示例代码展示了如何使用 Go 语言操作 MySQL 数据库的增删改查操作。在实际应用中,您可能需要根据具体需求调整代码,例如处理错误、优化性能等。希望本文能帮助您更好地理解 Go 语言与 MySQL 数据库的交互。
Comments NOTHING