Go Web 编程实战Go Web 编程实战
首页
课程导读
首页
课程导读
  • 课程导读
  • 课程目录

    • Go基础语法精要
    • Web基础与HTTP处理
    • Gin框架入门
    • 路由与中间件
    • 数据库操作
    • 模板渲染
    • 错误处理与日志
    • 测试与部署
    • 高级中间件模式
    • 微服务架构
    • 性能优化
    • 安全最佳实践
    • 项目结构与代码组织

数据库操作

1. 数据库驱动与连接

Go使用database/sql标准库操作数据库,需要单独安装驱动:

# MySQL驱动
go get -u github.com/go-sql-driver/mysql

# PostgreSQL驱动
go get -u github.com/lib/pq
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql" // 匿名导入,只执行init函数
)

func main() {
    // 打开数据库连接
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        panic(err)
    }
    defer db.Close()
    
    // 验证连接
    err = db.Ping()
    if err != nil {
        panic(err)
    }
}

2. 基本CRUD操作

查询单行

type User struct {
    ID   int
    Name string
    Age  int
}

func getUser(db *sql.DB, id int) (*User, error) {
    var user User
    err := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", id).
        Scan(&user.ID, &user.Name, &user.Age)
    if err != nil {
        return nil, err
    }
    return &user, nil
}

查询多行

func getUsers(db *sql.DB) ([]User, error) {
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()
    
    var users []User
    for rows.Next() {
        var user User
        if err := rows.Scan(&user.ID, &user.Name, &user.Age); err != nil {
            return nil, err
        }
        users = append(users, user)
    }
    return users, nil
}

插入数据

func createUser(db *sql.DB, user *User) error {
    result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", 
        user.Name, user.Age)
    if err != nil {
        return err
    }
    
    id, err := result.LastInsertId()
    if err != nil {
        return err
    }
    user.ID = int(id)
    return nil
}

更新数据

func updateUser(db *sql.DB, user *User) error {
    _, err := db.Exec("UPDATE users SET name = ?, age = ? WHERE id = ?", 
        user.Name, user.Age, user.ID)
    return err
}

3. 事务处理

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

4. ORM框架简介

GORM示例

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type Product struct {
    gorm.Model
    Code  string
    Price uint
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    
    // 自动迁移
    db.AutoMigrate(&Product{})
    
    // 创建记录
    db.Create(&Product{Code: "D42", Price: 100})
    
    // 查询记录
    var product Product
    db.First(&product, "code = ?", "D42")
}

提示:对于简单项目,标准库可能足够;对于复杂项目,考虑使用ORM如GORM。但理解底层SQL操作非常重要。

Prev
路由与中间件
Next
模板渲染