Golang连接MySQL数据库的实现方法

Golang连接MySQL数据库的实现方法 你好,我该如何将我的项目与 MySQL 数据库连接起来?

2 回复

首先,你需要一个驱动程序(https://github.com/go-sql-driver/mysql)
然后查看这里的示例 https://github.com/go-sql-driver/mysql/wiki/Examples

更多关于Golang连接MySQL数据库的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中连接MySQL数据库通常使用database/sql包和相应的MySQL驱动。以下是完整的实现方法:

1. 安装MySQL驱动

首先安装Go语言的MySQL驱动:

go get -u github.com/go-sql-driver/mysql

2. 基本连接示例

package main

import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 数据库连接字符串格式:用户名:密码@协议(地址:端口)/数据库名?参数
    dsn := "username:password@tcp(localhost:3306)/mydatabase?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("成功连接到MySQL数据库")
}

3. 完整的使用示例

package main

import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID   int
    Name string
    Age  int
}

func main() {
    // 连接数据库
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // 创建表
    createTableSQL := `
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        age INT
    )`
    
    _, err = db.Exec(createTableSQL)
    if err != nil {
        log.Fatal("创建表失败:", err)
    }
    
    // 插入数据
    insertSQL := "INSERT INTO users (name, age) VALUES (?, ?)"
    result, err := db.Exec(insertSQL, "张三", 25)
    if err != nil {
        log.Fatal("插入数据失败:", err)
    }
    
    id, _ := result.LastInsertId()
    fmt.Printf("插入成功,ID: %d\n", id)
    
    // 查询数据
    querySQL := "SELECT id, name, age FROM users WHERE id = ?"
    var user User
    err = db.QueryRow(querySQL, id).Scan(&user.ID, &user.Name, &user.Age)
    if err != nil {
        log.Fatal("查询失败:", err)
    }
    
    fmt.Printf("查询结果: ID=%d, Name=%s, Age=%d\n", user.ID, user.Name, user.Age)
    
    // 查询多条数据
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatal("查询失败:", err)
    }
    defer rows.Close()
    
    var users []User
    for rows.Next() {
        var u User
        err = rows.Scan(&u.ID, &u.Name, &u.Age)
        if err != nil {
            log.Fatal("扫描数据失败:", err)
        }
        users = append(users, u)
    }
    
    fmt.Println("所有用户:")
    for _, u := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d\n", u.ID, u.Name, u.Age)
    }
}

4. 连接池配置

func setupDB() *sql.DB {
    dsn := "username:password@tcp(localhost:3306)/mydatabase?charset=utf8mb4"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    
    // 配置连接池
    db.SetMaxOpenConns(25)      // 最大打开连接数
    db.SetMaxIdleConns(10)      // 最大空闲连接数
    db.SetConnMaxLifetime(5 * time.Minute) // 连接最大生存时间
    
    return db
}

5. 事务处理示例

func transferMoney(db *sql.DB, fromID, toID int, amount float64) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    
    defer func() {
        if err != nil {
            tx.Rollback()
        }
    }()
    
    // 扣款
    _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, fromID)
    if err != nil {
        return err
    }
    
    // 收款
    _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, toID)
    if err != nil {
        return err
    }
    
    return tx.Commit()
}

这些示例展示了Go语言连接MySQL数据库的基本方法和常见操作,包括连接建立、CRUD操作、连接池配置和事务处理。

回到顶部