go 操作mysql

在 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 表中有一些数据(或者至少表结构存在),以便你可以测试查询和更新操作。

Posted in Go