ZBLOG

golang 读取mysql

在 Golang 中读取 MySQL 数据库,通常使用 database/sql 标准库配合 MySQL 驱动(如 github.com/go-sql-driver/mysql)。以下是完整示例:


1. 安装 MySQL 驱动

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

2. 连接 MySQL 数据库

(1) 基础连接

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" // 匿名导入,仅初始化驱动
)

func main() {
	// 格式: "username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True"
	dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal("Connection failed:", err)
	}
	fmt.Println("MySQL connected!")
}

(2) 连接池配置

db.SetMaxOpenConns(25)     // 最大连接数
db.SetMaxIdleConns(5)      // 空闲连接数
db.SetConnMaxLifetime(time.Minute * 5) // 连接存活时间

3. CRUD 操作示例

假设有一张表 users

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

(1) INSERT (创建数据)

result, err := db.Exec(
    "INSERT INTO users (name, email) VALUES (?, ?)",
    "Alice",
    "alice@example.com",
)
if err != nil {
    log.Fatal(err)
}

id, _ := result.LastInsertId()
fmt.Printf("Inserted ID: %d\n", id)

(2) SELECT (查询单行)

var user struct {
    ID    int64
    Name  string
    Email string
}

err := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", 1).Scan(
    &user.ID,
    &user.Name,
    &user.Email,
)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", user)

(3) SELECT (查询多行)

rows, err := db.Query("SELECT id, name, email FROM users")
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
	var user struct {
		ID    int64  
		Name  string 
		Email string 
	}
	err = rows.Scan(&user.ID, &user.Name, &user.Email)
	if err != nil { 
        log.Fatal(err)
    }
	fmt.Printf("%+v\n", user)
}
if rows.Err() != nil { //检查遍历是否出错 
	log.Fatal(rows.Err())
} 

(4)UPDATE (更新数据)

result ,err:=db .Exec ("UPDATE users SET name=? WHERE id=?", "Bob" ,1 )  
 if err!=nil {  
     log .Fatal (err )  
 }  

 affected,_:=result.RowsAffected ()  
 fmt.Printf ("Updated %d row(s)\n" ,affected )   

#### (5)DELETE (删除数据)

 result ,err:=db .Exec ("DELETE FROM users WHERE id=?" ,1 )   
 if err!=nil {     
     log .Fatal (err )     
 }     

 affected,_:=result.RowsAffected ()     
 fmt.Printf ("Deleted %d row(s)\n" ,affected )    

### 4。事务处理

 tx ,err:=db.Begin ()    
 if err!=nil {      
     log .Fatal (err )      
 }      

 _,execErr:=tx.Exec ("INSERT INTO users(name ,email )VALUES(? ,?)","Eve","eve@example.com")      
 _,execErr2:=tx.Exec ("UPDATE accounts SET balance=balance-100 WHERE user_id=?",3 )      

 if execErr!=nil || execErr2!=nil{      
     _=tx.Rollback ()      
     log .Fatal ("Transaction failed")      
 } else{      
     _=tx.Commit ()      
     fmt.Println("Transaction succeeded!")       
 }       

### 5。ORM推荐(可选)
如果需要更高级的ORM功能:

  • GORM: 最流行的Go ORM库
  • XORM: 轻量级ORM

### 6。常见错误排查
|问题|解决方案|
|—|—|
|dial tcp timeout|检查MySQL服务是否运行、防火墙规则|
|Access denied|验证用户名/密码是否正确|
|driver not found|确保匿名导入_ "github.com/go-sql-driver/mysql"|


通过以上步骤即可完成Golang与MySQL的基础交互!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23829

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?