MySQL学习之go-mysql

1.安装和导入

首先需要安装数据库驱动:

shell 复制代码
go get -u github.com/go-sql-driver/mysql
go get -u github.com/lib/pq

导入需要的包

go 复制代码
import (
	"databse/sql"
	"fmt"
	"log"
	_ "github.com/go-sql-driver/mysql"
)

2.连接数据库

go 复制代码
func main(){
	db,err :=sql.Open("msyql","username:password@tcp(127.0.0.1:3306)/dbname")
	if err != nil {
		lgo.Fatal(err)
	}
	defer db.Close()
	err = db.Ping()
	if err != nil {
		log.Fatel(err)
	}
	fmt.Println("数据库连接成功")
}

3.基础CRUD操作

1. 创建表

go 复制代码
func createTable(db *sql.DB)error{
	query := `
			CREATE TABLE IF NOT EXSTS users(
				id INT AUTO_INCREAMENT PRIMARY KEY,
				name VARCHAR(100) NOT NULL,
				email VARCAHR(100) UNIQUE NOT NULL,
				age 	INT,
				created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
			)
	`_,err  db.Exec(query)
	return err
}

2. 插入数据

go 复制代码
func insertUser(db *sql.DB, name, email string, age int) (int64, error) {
    result, err := db.Exec(
        "INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
        name, email, age,
    )
    if err != nil {
        return 0, err
    }
    
    id, err := result.LastInsertId()
    return id, err
}

3. 查询数据

go 复制代码
type User struct {
    ID        int
    Name      string
    Email     string
    Age       int
    CreatedAt string
}

// 查询单个用户
func getUser(db *sql.DB, id int) (*User, error) {
    var user User
    err := db.QueryRow(
        "SELECT id, name, email, age, created_at FROM users WHERE id = ?", 
        id,
    ).Scan(&user.ID, &user.Name, &user.Email, &user.Age, &user.CreatedAt)
    
    if err != nil {
        return nil, err
    }
    return &user, nil
}

// 查询多个用户
func getUsers(db *sql.DB) ([]User, error) {
    rows, err := db.Query("SELECT id, name, email, age, created_at FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()
    
    var users []User
    for rows.Next() {
        var user User
        err := rows.Scan(&user.ID, &user.Name, &user.Email, &user.Age, &user.CreatedAt)
        if err != nil {
            return nil, err
        }
        users = append(users, user)
    }
    
    return users, nil
}

4. 更新数据

go 复制代码
func updateUser(db *sql.DB, id int, name, email string, age int) error {
    _, err := db.Exec(
        "UPDATE users SET name = ?, email = ?, age = ? WHERE id = ?",
        name, email, age, id,
    )
    return err
}

5.删除数据

go 复制代码
func deleteUser(db *sql.DB, id int) error {
    _, err := db.Exec("DELETE FROM users WHERE id = ?", id)
    return err
}

4.预处理语句

go 复制代码
func batchInsertUsers(db *sql.DB,users []User)error{
	stmt,err :=db.Prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)")
	if err != nil {
		return err
	}
	defer stmt.Close()
    
    for _, user := range users {
        _, err := stmt.Exec(user.Name, user.Email, user.Age)
        if err != nil {
            return err
        }
    }
    return nil
}

5.事务处理

go 复制代码
func transferMoney(db *sql.DB, fromID, toID int, amount float64) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    
    // 执行转账操作
    _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, fromID)
    if err != nil {
        tx.Rollback()
        return err
    }
    
    _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, toID)
    if err != nil {
        tx.Rollback()
        return err
    }
    
    return tx.Commit()
}

6.连接吃配置

go 复制代码
func initDB() *sql.DB {
    db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/dbname")
    if err != nil {
        log.Fatal(err)
    }
    
    // 配置连接池
    db.SetMaxOpenConns(25)      // 最大打开连接数
    db.SetMaxIdleConns(10)      // 最大空闲连接数
    db.SetConnMaxLifetime(5 * time.Minute)  // 连接最大生存时间
    
    return db
}

总结

  1. sql.Open() 只创建连接对象,不实际连接数据库

  2. db.Ping() 用于验证连接

  3. db.Exec() 用于执行不返回行的操作

  4. db.Query() 用于查询多行数据

  5. db.QueryRow() 用于查询单行数据

  6. 使用 预处理语句 提高性能和安全性

  7. 记得 defer rows.Close() 和 defer stmt.Close()

  8. 使用 事务 保证数据一致性

  9. 合理配置 连接池 参数

相关推荐
Z...........3 分钟前
MYSQL进阶查询
数据库·mysql
深蓝海拓7 分钟前
PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
笔记·python·qt·学习·pyqt
Dxy12393102161 小时前
MySQL INSERT ... ON DUPLICATE KEY UPDATE 与非主键唯一字段
数据库·mysql
星火开发设计2 小时前
C++ 预处理指令:#include、#define 与条件编译
java·开发语言·c++·学习·算法·知识
BackCatK Chen2 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
深蓝海拓2 小时前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt
理人综艺好会3 小时前
Web学习之用户认证
前端·学习
●VON3 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
AI视觉网奇3 小时前
FBX AnimSequence] 动画长度13与导入帧率30 fps(子帧0.94)不兼容。动画必须与帧边界对齐。
笔记·学习·ue5
woodykissme4 小时前
倒圆角问题解决思路分享
笔记·学习·工艺