文章目录

Go 数据库:sql 包与 ORM 框架

发布于 2026-04-08 03:27:11 · 浏览 9 次 · 评论 0 条

Go 语言提供了两种主要方式与数据库交互:使用标准库 database/sql 进行底层控制,或使用 ORM(对象关系映射)框架进行高效开发。


方式一:使用 database/sql 包

这是 Go 官方提供的轻量级接口,要求手动处理 SQL 语句、行和结果。适合追求性能或处理复杂 SQL 的场景。

  1. 安装 数据库驱动。Go 的 sql 包需要具体的驱动才能工作。打开终端,运行 以下命令安装 MySQL 驱动(以 MySQL 为例):
go get -u github.com/go-sql-driver/mysql
  1. 编写 连接代码。创建文件 main.go导入 必要的包。注意驱动包前面的 _,表示仅执行其 init 函数进行注册。
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
  1. 建立 数据库连接。使用 sql.Open 获取数据库句柄。
func main() {
    // 格式: 用户名:密码@协议(地址:端口)/数据库名
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    // 检查连接是否有效
    err = db.Ping()
    if err != nil {
        panic(err)
    }
    fmt.Println("连接成功")
}
  1. 查询 数据。使用 db.Query 执行查询,遍历 结果集,并使用 rows.Scan 将数据映射到变量。
rows, err := db.Query("SELECT id, name FROM users WHERE id = ?", 1)
if err != nil {
    panic(err)
}
defer rows.Close()

for rows.Next() {
    var id int
    var name string
    // 将当前行的数据扫描到变量中
    if err := rows.Scan(&id, &name); err != nil {
        panic(err)
    }
    fmt.Println(id, name)
}
  1. 执行 插入或更新操作。使用 db.Exec 执行不需要返回行的 SQL。
result, err := db.Exec("INSERT INTO users(name) VALUES(?)", "Alice")
if err != nil {
    panic(err)
}
// 获取插入的 ID
lastID, _ := result.LastInsertId()
fmt.Println("新插入的 ID:", lastID)

方式二:使用 ORM 框架 (以 GORM 为例)

ORM 将数据库表映射为 Go 的结构体,允许你用操作对象的方式来操作数据库,减少了手写 SQL 的工作量。

  1. 安装 GORM 及其驱动。
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
  1. 定义 数据模型。创建 一个结构体,标签 gorm 用于定义列名和约束。
import "gorm.io/gorm"

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:255"`
}
  1. 连接 数据库并进行自动迁移。GORM 会自动根据结构体创建或更新表结构。
import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

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(err)
}

// 自动迁移表
db.AutoMigrate(&User{})
  1. 创建 数据记录。直接操作结构体对象并传入 Create 方法。
user := User{Name: "Bob"}
result := db.Create(&user)
fmt.Println("新记录 ID:", user.ID)
  1. 查询 数据记录。使用链式方法构建查询条件。
var user User
// 查找 ID 为 1 的用户
db.First(&user, 1)
fmt.Println("用户名:", user.Name)

// 查找 Name 为 "Bob" 的用户
db.Where("name = ?", "Bob").First(&user)
  1. 更新 数据记录。使用 SaveUpdates 方法。
db.Model(&user).Update("Name", "Bob Updated")
  1. 删除 数据记录。
db.Delete(&user, 1)

对比与选择建议

下表总结了两种方式的核心差异,帮助你根据项目需求做决定。

特性 database/sql ORM (GORM)
控制力 高,完全掌控 SQL 执行细节 中,框架自动生成 SQL
开发效率 较低,需手写大量样板代码 高,自动处理 CRUD
性能 极高,无额外开销 较高,有少量反射开销
学习曲线 陡峭,需理解连接、结果集等概念 平缓,符合面向对象思维
适用场景 复杂查询、性能敏感型应用 快速开发、业务逻辑复杂的 CRUD 应用

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文