Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

GORM数据库操作全面指南:创建、查询、更新与删除

阿贵
4月17日发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年04月17日,已超过26天没有更新,若内容或图片失效,请留言反馈。

GORM数据库操作全面指南:创建、查询、更新与删除

GORM是Go语言中最流行的ORM库之一,它简化了数据库操作,让开发者可以用面向对象的方式与数据库交互。本文将详细介绍如何使用GORM进行数据库的创建(Create)、查询(Read)、更新(Update)和删除(Delete)操作。
go.jpg

一、准备工作

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 {
  // 处理错误
}

七、最佳实践

  1. 错误处理:始终检查GORM操作的错误返回
  2. 日志:在开发环境启用GORM日志方便调试
  3. 性能:批量操作时使用批量插入/更新
  4. 安全:使用预编译语句防止SQL注入
  5. 调试:复杂查询可以使用Debug()方法查看生成的SQL

通过掌握这些基本的CRUD操作,您已经可以使用GORM完成大多数数据库交互任务。GORM还提供了许多高级功能如关联、钩子、作用域等,可以进一步探索以构建更复杂的应用。

喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消 登录评论