首页 > 其他分享 >小徐先生的GORM使用教程

小徐先生的GORM使用教程

时间:2023-12-22 12:12:48浏览次数:38  
标签:教程 db gorm dsn bool mysql 徐先生 零值 GORM

小徐先生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时兼容时间和表情

标签:教程,db,gorm,dsn,bool,mysql,徐先生,零值,GORM
From: https://www.cnblogs.com/runninginsilence/p/17921321.html

相关文章

  • 无涯教程-PL/SQL - 简介
    PL/SQL(ProceduralLanguage/SQL)是甲骨文公司专有的SQL扩展语言,应用在甲骨文公司的Oracle数据库系统。一些的SQL数据库管理系统也提供了类似的扩展SQL语言。PL/SQL的的语法非常类似于Ada,而且像1980年代的Ada编译器一样,PL/SQL的运作系统使用Diana作为中介语言。重要的是PL/SQL紧密......
  • 【教程】使用ipagurd打包与混淆Cocos2d-x的Lua脚本
    【教程】使用ipagurd打包与混淆Cocos2d-x的Lua脚本文章目录摘要引言正文1.准备工作2.使用ipaguard处理Lua文件3.运行ipagurd进行混淆代码加密具体步骤测试和配置阶段IPA重签名操作步骤4.IPA重签名与发布总结 摘要本文将介绍如何使用ipagurd工具对Cocos2d-......
  • 无涯教程-Haskell - Nested if-else 语句函数
    以下代码显示了如何在Haskell中使用嵌套的if-else语句-main=doletvar=26ifvar==0thenputStrLn"Numberiszero"elseifvar`rem`2==0thenputStrLn"NumberisEven"elseputStrLn"NumberisOdd"在上面的示例中......
  • RV1126 分区教程
    一、前言期初我是想弄一个分区存放自己的APP程序,如果需要更改应用的时候,只需要烧写独立的分区即可,就不需要重新烧写rootfs。这是一个简单的操作,为啥还需要记录了,因为我在里面遇到了一些坑,思路走错了,便折腾了几天。为啥会有这样的需求了,一是为了管理方便,二是将应用程序给新手的......
  • TVBOX下载配置及本地包使用教程
    本文以电视上使用为准。【TVBOX软件下载】https://qiqi2020.lanzouq.com/b09svqv1cTVBOX有各种改版,这里推荐下载影视仓_5.0.13.apk,因为它支持“多仓”:【软件安装】打开电视上的“当贝助手”,用它来上传软件安装包,其它可以传文件到电视的软件也可以。选择文件快传:电脑浏览器打......
  • 无涯教程-Haskell - Monads
    Monads只是一种带有某些附加函数的ApplicativeFunctor,它是一个Type类,它管理称为monadic规则的三个基本规则。所有这三个规则严格适用于Monad声明,如下所示-classMonadmwherereturn::a->ma(>>=)::ma->(a->mb)->mb(>>)::ma->mb->mb......
  • Python Selenium WebDriver 使用教程
    ​ 1、安装Selenium使用SeleniumWebDriver需要先安装需要安装Selenium库,安装使用的pip在命令如下,pipinstallselenium2、安装浏览器驱动程序SeleniumWebDriver需要特定浏览器的驱动程序,使用的浏览器来下载相应的驱动程序,以便后续在代码中引用。下载地址:ChromeWebDri......
  • 无涯教程-Haskell - 输入&输出
    到目前为止,我们讨论的所有示例本质上都是静态的,在本章中,我们将学习与用户动态交流,我们将学习Haskell中使用的不同输入和输出技术。文件和流到目前为止,我们已经对程序本身中的所有输入进行了硬编码,我们一直在从静态变量获取输入,现在,让我们学习如何从外部文件读取和写入。让我们......
  • Microsoft Visio 2021专业版安装包软件下载安装教程
    Microsoftvisio2021,简称visio2021。这是一款专业的专业矢量绘图软件。visio2021不但新增了许许多多的功能,而且还优化了众多的界面性能,其一系列的改动就是为了给予用户们最直观、最便利的操作感体验。同时呢,软件的操作也是相当的简单,只要用户熟悉软件上方中的菜单栏,其菜单栏与大家......
  • 无涯教程-Haskell - 函数组合
    功能组合是将一个功能的输出用作另一个功能的输入的过程,如果我们学习组成背后的数学会更好,在数学中,组成由f{g(x)}表示,其中g()是一个函数,其输出用作输入另一个功能,即f()。看下面的示例代码。在这里,我们使用函数组合来计算输入数字是偶数还是奇数。eveno::Int->Boolnoto......