小徐先生1212的Gorm教程
前言
记录学习过程用
来自微信公众号 小徐先生的编程时间
微信公众号同名.
数据库
gorm中的核心就是 *gorm.DB 这个实例的链式调用.
因此创建db实例的过程分为三步:
- 设置好连接 mysql 的 dsn(data source name)
- 通过 gorm.Config 完成 db 有关的自定义配置
- 通过 gorm.Open 方法完成 db 实例的创建
为了方便讲解, 它是使用全局db模式的方式来对外暴露数据的.
package mysql
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
// 全局 db 模式
db *gorm.DB
// 单例工具
dbOnce sync.Once
// 连接 mysql 的 dsn
dsn = "username:password@(ip:port)/database?timeout=5000ms&readTimeout=5000ms&writeTimeout=5000ms&charset=utf8mb4&parseTime=true&loc=Local"
)
func getDB()(*gorm.DB ,error){
var err error
dbOnce.Do(func(){
// 创建 db 实例
db, err = gorm.Open(mysql.Open(dsn),&gorm.Config{})
})
return db,err
}
里面涉及到的 Once struct是go标准库用来实现单例方法的工具.
gorm.Config
type Config struct {
// gorm 中,针对单笔增、删、改操作默认会启用事务. 可以通过将该参数设置为 true,禁用此机制
SkipDefaultTransaction bool
// 表、列的命名策略
NamingStrategy schema.Namer
// 自定义日志模块
Logger logger.Interface
// 自定义获取当前时间的方法
NowFunc func() time.Time
// 是否启用 prepare sql 模板缓存模式
PrepareStmt bool
// 在 gorm 创建 db 实例时,会创建 conn 并通过 ping 方法确认 dsn 的正确性. 倘若设置此参数,则会禁用 db 初始化时的 ping 操作
DisableAutomaticPing bool
// 不启用迁移过程中的外联键限制
DisableForeignKeyConstraintWhenMigrating bool
// 是否禁用嵌套事务
DisableNestedTransaction bool
// 是否允许全局更新操作. 即未使用 where 条件的情况下,对整张表的字段进行更新
AllowGlobalUpdate bool
// 执行 sql 查询时使用全量字段
QueryFields bool
// 批量创建时,每个批次的数据量大小
CreateBatchSize int
// 条件创建器
ClauseBuilders map[string]clause.ClauseBuilder
// 数据库连接池
ConnPool ConnPool
// 数据库连接器
Dialector
// 插件集合
Plugins map[string]Plugin
// 回调钩子
callbacks *callbacks
// 全局缓存数据,如 stmt、schema 等内容
cacheStore *sync.Map
}
上面的是查询内容.
模型定义
一般推荐往定义的模型中插入 gorm.Model对象, 基于组合的方式, 来将通用的属性注入到模型中.
值得一提的是,在 gorm 体系中,一个 po 模型只要启用了 deletedAt 字段,则默认会开启软删除机制:在执行删除操作时,不会立刻物理删除数据,而是仅仅将 po 的 deletedAt 字段置为非空.
标签
参考这张图片
零值更新问题
golang的基础类型默认带有零值; 无法区分是默认零值还是显式带上的零值; gorm的策略是忽略零值;
一般来使用指针类型来声明;