当前位置: 首页 > news >正文

GORM 知识点入门

GORM 知识点入门

一、模型定义与约定

模型结构

在 GORM 中,模型通过 Go 结构体进行定义,字段支持多种数据类型,包括基本数据类型、time.Time 以及实现了 Scanner/Valuer 接口的自定义类型。默认情况下,使用 ID 作为主键。表名会自动转换为结构体名的蛇形复数形式,例如 UserInfo 会映射为 user_infos。字段名则会转换为蛇形命名,比如 CreatedAt 会转为 created_at

标签控制

通过结构体标签,我们可以实现字段级的权限控制,例如设置字段为只读或忽略迁移。此外,还可以指定默认值、创建索引以及设置外键关联等。例如:

type User struct {Name string `gorm:"<-:create"`  // 仅允许创建时写入Age  int    `gorm:"default:18"` // 默认值
}

标签还支持自动时间追踪功能(如 autoCreateTimeautoUpdateTime)以及软删除功能(通过 gorm.DeletedAt 实现)。

二、数据库连接与配置

连接方式

GORM 支持多种数据库,通过 DSN(数据源名称)进行连接。以下是连接 MySQL 的示例:

dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

在连接时,需注意时区设置(如 loc=Local)和解析时间参数(parseTime=True)。

连接池优化

为了提升性能,我们可以通过 sql.DB 设置连接池参数,包括最大空闲连接数、最大打开连接数以及连接的复用时间等。

三、CRUD 操作

创建(Create)

  • 单条插入db.Create(&user)
  • 批量插入db.CreateInBatches(&users, 100),支持事务和回填主键。
  • 指定字段插入db.Select("Name").Create(&user) 或忽略字段 db.Omit("Age")

查询(Read)

  • 基础查询 :使用 First(按主键查询)、Find(多条件查询)、Where(条件筛选)等方法。
  • 预加载关联数据db.Preload("Comments").Find(&posts),可避免 N + 1 查询问题。
  • 链式操作 :支持 OrderLimitGroup 等,如 db.Where("age > ?", 20).Order("id desc")

更新(Update)

  • 单字段更新db.Model(&user).Update("Name", "NewName")
  • 多字段更新Updates(map[string]interface{}{"Name": "Alice", "Age": 25}),需要注意的是,若字段值为零值,需使用 Select 显式指定。

删除(Delete)

  • 软删除 :默认使用 DeletedAt 字段进行标记,如需物理删除,可通过 Unscoped().Delete() 实现。
  • 条件删除db.Where("age < ?", 18).Delete(&User{})

四、高级功能

事务处理

可以使用 db.Transaction(func(tx *gorm.DB) error { ... }) 来封装事务,它支持嵌套事务以及保存点功能。

钩子(Hooks)

在 CRUD 操作前后,可以触发自定义逻辑。例如,利用 BeforeCreateAfterUpdate 等钩子进行数据校验或记录日志。

关联与预加载

GORM 支持一对一、一对多、多对多等多种关联关系。通过 Preload 预加载关联数据,能够有效减少查询次数。

性能优化

  • 关闭默认事务 :设置 SkipDefaultTransaction: true
  • 预编译语句 :启用 PrepareStmt: true 来缓存 SQL 语句。
  • 调试模式 :使用 db.Debug().Find(&users) 输出实际执行的 SQL 语句,方便进行调试和性能分析。

五、注意事项

零值处理

在使用结构体进行查询时,零值字段(如 0"")会被忽略。若要包含这些条件,需改用 mapSelect 进行显式指定。

错误处理

需要检查 result.Error,部分操作(如 First 查询无结果)可能会返回 ErrRecordNotFound 错误。

指针与值类型

在进行关联查询时,要注意区分指针和值类型,以免出现空指针异常。

扩展资源

  • 插件与扩展 :GORM 支持 Prometheus 监控、多数据库读写分离(Database Resolver)等功能。
  • 迁移工具AutoMigrate 可自动同步模型与表结构,但对于复杂的变更,建议手动处理。

更详细的可以看Gorm中文文档:https://gorm.io/zh_CN/docs/index.html

相关文章:

  • 机器学习09-正规方程
  • MetaMask安装及使用-使用水龙头获取测试币的坑?
  • 计算机网络 - 2.基础协议
  • 什么是 Boosting
  • 2025 ISCC 练武赛Pwn-wp(含附件)
  • KAG:通过知识增强生成提升专业领域的大型语言模型(五)
  • ABP vNext 多租户系统实现登录页自定义 Logo 的最佳实践
  • 【Canvas与诗词】醉里挑灯看剑 梦回吹角连营
  • TYUT-企业级开发教程-第三章
  • Qt Widgets模块功能详细说明,基本控件:QPushButton(二)
  • 数据脱敏-6种方案,你选哪种?
  • DockerFile实战
  • 护网行动——蓝队防守方案指南
  • 系分论文《论信息系统缓存的分析和应用》
  • AI日报 - 2025年05月19日
  • C++:⾯向对象的三⼤特性
  • TensorRT
  • 使用 Auto-Keras 进行自动化机器学习
  • 拓展运算符与数组解构赋值的区别
  • Vibe Coding:编程中的氛围与效率的艺术
  • “打铁”热邂逅江南水乡,长三角首个国际级铁三赛事有何不同
  • 证监会披露两起操纵市场处罚结果,今年来涉操纵股票罚没金额超7.5亿元
  • 烤肉店从泔水桶内捞出肉串再烤?西安未央区市监局:停业整顿
  • 收到延期付款利息,该缴纳增值税吗?
  • 多地举办演唱会等吸引游客刺激消费,经济日报:引导粉丝经济理性健康发展
  • 美联储主席:供应冲击或更频繁,将重新评估货币政策方法中的通胀和就业因素