GORM数据库操作全面指南:创建、查询、更新与删除
GORM是Go语言中最流行的ORM库之一,它简化了数据库操作,让开发者可以用面向对象的方式与数据库交互。本文将详细介绍如何使用GORM进行数据库的创建(Create)、查询(Read)、更新(Update)和删除(Delete)操作。
一、准备工作
1. 安装GORM
首先需要安装GORM核心库和对应的数据库驱动(以MySQL为例):
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2. 初始化数据库连接
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// MySQL连接字符串格式:用户名:密码@协议(地址:端口)/数据库名?参数
dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
// 打开数据库连接
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败: " + err.Error())
}
// 自动迁移模型(创建表)
db.AutoMigrate(&User{}, &Product{})
}
3. 定义模型
type User struct {
gorm.Model // 内嵌gorm.Model,包含ID、CreatedAt、UpdatedAt、DeletedAt字段
Name string `gorm:"size:100"`
Email string `gorm:"uniqueIndex;size:255"`
Age int
Active bool `gorm:"default:true"`
}
type Product struct {
ID uint `gorm:"primaryKey"`
Code string `gorm:"uniqueIndex;size:50"`
Price float64
Category string `gorm:"index;size:100"`
}
二、创建(Create)操作
1. 创建单条记录
// 创建用户
newUser := User{Name: "张三", Email: "zhangsan@example.com", Age: 25}
result := db.Create(&newUser)
if result.Error != nil {
fmt.Println("创建用户失败:", result.Error)
} else {
fmt.Printf("创建成功,ID为%d\n", newUser.ID)
}
2. 批量创建
users := []User{
{Name: "李四", Email: "lisi@example.com", Age: 30},
{Name: "王五", Email: "wangwu@example.com", Age: 28},
{Name: "赵六", Email: "zhaoliu@example.com", Age: 35},
}
result := db.Create(&users)
if result.Error != nil {
fmt.Println("批量创建失败:", result.Error)
} else {
fmt.Printf("批量创建成功,共%d条记录\n", result.RowsAffected)
}
3. 选择性创建字段
// 只创建Name和Email字段
db.Select("Name", "Email").Create(&User{
Name: "钱七",
Email: "qianqi@example.com",
Age: 40, // 这个字段不会被创建
})
三、查询(Read)操作
1. 查询单条记录
// 通过主键查询
var user User
db.First(&user, 1) // 查询ID为1的用户
fmt.Println(user)
// 通过条件查询
db.First(&user, "name = ?", "张三")
2. 查询多条记录
var users []User
// 查询所有用户
db.Find(&users)
// 带条件查询
db.Where("age > ?", 25).Find(&users)
// 链式调用
db.Where("active = ?", true).
Order("age desc").
Limit(10).
Find(&users)
3. 高级查询
// 选择特定字段
db.Select("name", "age").Find(&users)
// 排序
db.Order("age desc, name asc").Find(&users)
// 分页
var page, pageSize int = 1, 10
db.Offset((page - 1) * pageSize).Limit(pageSize).Find(&users)
// 计数
var count int64
db.Model(&User{}).Where("age > ?", 25).Count(&count)
四、更新(Update)操作
1. 更新单个字段
// 先查询出要更新的记录
var user User
db.First(&user, 1)
// 更新单个字段
db.Model(&user).Update("Name", "张三四")
2. 更新多个字段
// 使用结构体更新(只更新非零值字段)
db.Model(&user).Updates(User{Name: "张三四", Age: 26})
// 使用map更新(可以更新为零值)
db.Model(&user).Updates(map[string]interface{}{"Name": "张三四", "Age": 0})
3. 批量更新
// 更新所有年龄大于30的用户为不活跃
db.Model(&User{}).Where("age > ?", 30).Update("Active", false)
// 使用Updates进行批量多字段更新
db.Model(&User{}).Where("active = ?", false).
Updates(map[string]interface{}{"Age": 0, "Name": "已注销"})
五、删除(Delete)操作
1. 物理删除(永久删除)
// 删除单条记录
db.Delete(&User{}, 1) // 删除ID为1的用户
// 条件删除
db.Where("name = ?", "张三四").Delete(&User{})
// 批量删除
db.Delete(&User{}, []int{1, 2, 3}) // 删除ID为1,2,3的记录
2. 软删除(如果模型包含DeletedAt字段)
// 软删除会自动设置DeletedAt字段
db.Delete(&user)
// 查询时自动过滤已软删除的记录
db.Find(&users) // 不会包含已软删除的记录
// 查询包含软删除的记录
db.Unscoped().Find(&users)
3. 永久删除软删除的记录
db.Unscoped().Delete(&user)
六、事务处理
// 自动事务
err := db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些操作
if err := tx.Create(&User{Name: "事务用户", Email: "tx@example.com"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Model(&User{}).Where("id = ?", 1).Update("age", 30).Error; err != nil {
return err
}
// 返回nil提交事务
return nil
})
if err != nil {
// 处理错误
}
七、最佳实践
- 错误处理:始终检查GORM操作的错误返回
- 日志:在开发环境启用GORM日志方便调试
- 性能:批量操作时使用批量插入/更新
- 安全:使用预编译语句防止SQL注入
- 调试:复杂查询可以使用
Debug()
方法查看生成的SQL
通过掌握这些基本的CRUD操作,您已经可以使用GORM完成大多数数据库交互任务。GORM还提供了许多高级功能如关联、钩子、作用域等,可以进一步探索以构建更复杂的应用。