在 Go 语言中,通过 database/sql 包和 github.com/go-sql-driver/mysql 驱动,你可以对 MySQL 数据库执行各种操作,包括增加、修改、删除和查询数据。以下是一个详细的示例,展示了这些操作:
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { // MySQL 连接字符串 dsn := "username:password@tcp(127.0.0.1:3306)/dbname" // 打开数据库连接 db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() // 检查数据库连接是否成功 err = db.Ping() if err != nil { log.Fatal(err) } // 增加一条数据 _, err = db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 25) if err != nil { log.Fatal(err) } fmt.Println("Inserted a new user.") // 修改一条数据 _, err = db.Exec("UPDATE users SET age = ? WHERE name = ?", 26, "Alice") if err != nil { log.Fatal(err) } fmt.Println("Updated a user's age.") // 删除一条数据 _, err = db.Exec("DELETE FROM users WHERE name = ?", "Alice") if err != nil { log.Fatal(err) } fmt.Println("Deleted a user.") // 查询一条数据 var name string var age int err = db.QueryRow("SELECT name, age FROM users WHERE name = ?", "Bob").Scan(&name, &age) // 假设Bob是存在的用户 if err != nil { if err == sql.ErrNoRows { fmt.Println("No rows were returned!") } else { log.Fatal(err) } } else { fmt.Printf("Queried user: %s, Age: %d\n", name, age) } // 查询多条数据 rows, err := db.Query("SELECT name, age FROM users") if err != nil { log.Fatal(err) } defer rows.Close() fmt.Println("Queried multiple users:") for rows.Next() { var name string var age int err = rows.Scan(&name, &age) if err != nil { log.Fatal(err) } fmt.Printf("User: %s, Age: %d\n", name, age) } // 检查是否还有错误发生(例如:rows.Next() 后调用 rows.Scan()) if err = rows.Err(); err != nil { log.Fatal(err) } }
注意事项:
连接字符串:确保你替换了 username, password, tcp(127.0.0.1:3306), 和 dbname 为你的 MySQL 数据库的实际信息。
错误处理:在每次数据库操作后,检查是否有错误发生,并进行适当的处理。
参数化查询:使用 ? 作为占位符,并通过 Exec 或 Query 方法的后续参数传递实际值,以防止 SQL 注入。
资源管理:使用 defer 语句确保在函数返回前关闭数据库连接和行集(rows)。
数据库表结构:确保你的 MySQL 数据库中有一个名为 users 的表,并且它包含 name 和 age 字段。
并发:database/sql 包支持并发操作,但请确保每个连接在并发访问时是安全的。通常,你会在多个 goroutine 之间共享一个 *sql.DB 实例,而不是 *sql.Conn。
事务:对于需要原子性操作的一系列数据库命令,你可以使用事务。在 Go 中,你可以通过调用 db.Begin() 来开始一个事务,并在完成所有操作后调用 tx.Commit() 或 tx.Rollback()。
运行这个示例之前,请确保你的 MySQL 数据库正在运行,并且 users 表中有一些数据(或者至少表结构存在),以便你可以测试查询和更新操作。