Go 语言提供了两种主要方式与数据库交互:使用标准库 database/sql 进行底层控制,或使用 ORM(对象关系映射)框架进行高效开发。
方式一:使用 database/sql 包
这是 Go 官方提供的轻量级接口,要求手动处理 SQL 语句、行和结果。适合追求性能或处理复杂 SQL 的场景。
- 安装 数据库驱动。Go 的
sql包需要具体的驱动才能工作。打开终端,运行 以下命令安装 MySQL 驱动(以 MySQL 为例):
go get -u github.com/go-sql-driver/mysql
- 编写 连接代码。创建文件
main.go,导入 必要的包。注意驱动包前面的_,表示仅执行其init函数进行注册。
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
- 建立 数据库连接。使用
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("连接成功")
}
- 查询 数据。使用
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)
}
- 执行 插入或更新操作。使用
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 的工作量。
- 安装 GORM 及其驱动。
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
- 定义 数据模型。创建 一个结构体,标签
gorm用于定义列名和约束。
import "gorm.io/gorm"
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:255"`
}
- 连接 数据库并进行自动迁移。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{})
- 创建 数据记录。直接操作结构体对象并传入
Create方法。
user := User{Name: "Bob"}
result := db.Create(&user)
fmt.Println("新记录 ID:", user.ID)
- 查询 数据记录。使用链式方法构建查询条件。
var user User
// 查找 ID 为 1 的用户
db.First(&user, 1)
fmt.Println("用户名:", user.Name)
// 查找 Name 为 "Bob" 的用户
db.Where("name = ?", "Bob").First(&user)
- 更新 数据记录。使用
Save或Updates方法。
db.Model(&user).Update("Name", "Bob Updated")
- 删除 数据记录。
db.Delete(&user, 1)
对比与选择建议
下表总结了两种方式的核心差异,帮助你根据项目需求做决定。
| 特性 | database/sql | ORM (GORM) |
|---|---|---|
| 控制力 | 高,完全掌控 SQL 执行细节 | 中,框架自动生成 SQL |
| 开发效率 | 较低,需手写大量样板代码 | 高,自动处理 CRUD |
| 性能 | 极高,无额外开销 | 较高,有少量反射开销 |
| 学习曲线 | 陡峭,需理解连接、结果集等概念 | 平缓,符合面向对象思维 |
| 适用场景 | 复杂查询、性能敏感型应用 | 快速开发、业务逻辑复杂的 CRUD 应用 |

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