小徐先生的GORM使用教程

发布时间 2023-12-22 11:57:03作者: 潜行1

小徐先生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的策略是忽略零值;

一般来使用指针类型来声明;

连接mysql时兼容时间和表情