5 GROM 高级主题

  • 复合主键
  • 写插件
    • 注册新的callback
    • 删除现有的callback
    • 替换现有的callback
    • 注册callback顺序
    • 预定义回调
  • 方言的特殊类型
    • 创建新方言
    • 方言的特殊类型
      • PostgreSQL
  • Logger
    • Logger
    • 自定义 Logger

复合主键

将多个字段设置为 primary key 以启用复合主键

type Product struct {ID           string `gorm:"primary_key"`LanguageCode string `gorm:"primary_key"`Code         stringName         string
}

请注意,默认情况下,带有 主键 标签的整型字段的会 auto_increment。 这可能会导致存在多个自动增长的整型主键,而不是单个复合主键。

想要创建包含多个整型的复合主键,你需要为这些整型字段关闭 auto_increment

type Product struct {CategoryID uint64 `gorm:"primary_key;auto_increment:false"`TypeID     uint64 `gorm:"primary_key;auto_increment:false"`
}

写插件

GORM本身由Callbacks提供支持,因此您可以根据需要完全自定义GORM

注册新的callback

注册新的callback到callbacks中

func updateCreated(scope *Scope) {if scope.HasColumn("Created") {scope.SetColumn("Created", NowFunc())}
}db.Callback().Create().Register("update_created_at", updateCreated)
// 为 Create 注册一个 callback

删除现有的callback

从callbacks中删除callback

db.Callback().Create().Remove("gorm:create")
// 从Create回调中删除`gorm:create`回调

替换现有的callback

替换同名callback

db.Callback().Create().Replace("gorm:create", newCreateFunction)
// 使用新函数`newCreateFunction`替换回调`gorm:create`用于创建过程

注册callback顺序

注册 callback 顺序

db.Callback().Create().Before("gorm:create").Register("update_created_at", updateCreated)
db.Callback().Create().After("gorm:create").Register("update_created_at", updateCreated)
db.Callback().Query().After("gorm:query").Register("my_plugin:after_query", afterQuery)
db.Callback().Delete().After("gorm:delete").Register("my_plugin:after_delete", afterDelete)
db.Callback().Update().Before("gorm:update").Register("my_plugin:before_update", beforeUpdate)
db.Callback().Create().Before("gorm:create").After("gorm:before_create").Register("my_plugin:before_create", beforeCreate)

预定义回调

GORM定义了回调以执行其CRUD操作,在开始编写插件之前检查它们。

  • Create callbacks
  • Update callbacks
  • Query callbacks
  • Delete callbacks
  • Row Query callbacks - 没有默认注册的 callback

Row Query callbacks 在运行 RowRows 时被调用,默认情况下它没有注册的回调,你可以注册一个新的回调:

func updateTableName(scope *gorm.Scope) {scope.Search.Table(scope.TableName() + "_draft") // 追加 `_draft` 到表名后
}db.Callback().RowQuery().Register("publish:update_table_name", updateTableName)

查阅所有可用 API

方言的特殊类型

创建新方言

GORM 官方支持以下几种方言:sqlite, mysql, postgres, mssql.

你可以通过创建一个新的方言来为其它数据库提供支持。 当你创建一个新方言的时候,你必须实现 the dialect interface 接口。

某些数据库可能兼容 mysqlpostgres 方言,此时你可以直接使用现有方言。

方言的特殊类型

某些 SQL 的方言包含特殊的、非标准的类型,比如 PostgreSQL 中的 jsonb 类型。 GORM 支持其中的几种类型,如下所示。

PostgreSQL

GORM 支持加载以下 PostgreSQL 特有类型: - jsonb - hstore

Model 定义如下:

import ("encoding/json""github.com/jinzhu/gorm/dialects/postgres"
)type Document struct {Metadata postgres.JsonbSecrets  postgres.HstoreBody     stringID       int
}

你可以这样使用 model:

password := "0654857340"
metadata := json.RawMessage(`{"is_archived": 0}`)
sampleDoc := Document{Body: "This is a test document",Metadata: postgres.Jsonb{ RawMessage: metadata },Secrets: postgres.Hstore{"password": &password},
}// 将 sampleDoc 添加到数据库
db.Create(&sampleDoc)// 再次检索字段,以确保它们是否已经正确添加
resultDoc := Document{}
db.Where("id = ?", sampleDoc.ID).First(&resultDoc)metadataIsEqual := reflect.DeepEqual(resultDoc.Metadata, sampleDoc.Metadata)
secretsIsEqual := reflect.DeepEqual(resultDoc.Secrets, sampleDoc.Secrets)// 打印结果应该是 "true"
fmt.Println("Inserted fields are as expected:", metadataIsEqual && secretsIsEqual)

Logger

Logger

Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误

// 启用Logger,显示详细日志
db.LogMode(true)// 禁用日志记录器,不显示任何日志
db.LogMode(false)// 调试单个操作,显示此操作的详细日志
db.Debug().Where("name = ?", "jinzhu").First(&User{})

自定义 Logger

参考GORM的默认记录器如何自定义它 https://github.com/jinzhu/gorm/blob/master/logger.go

例如,使用Revel的Logger作为GORM的输出

db.SetLogger(gorm.Logger{revel.TRACE})

使用 os.Stdout 作为输出

db.SetLogger(log.New(os.Stdout, "\r\n", 0))




5 GROM 高级主题 (golang)相关推荐

  1. Redis 高级主题之布隆过滤器(BloomFilter)

    最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...

  2. Spread for Windows Forms高级主题(3)---单元格的编辑模式

    理解单元格的编辑模式 通常情况下,当终端用户双击单元格时,编辑控件将允许用户在该单元格中输入内容.在一个单元格中编辑的能力被称为编辑模式.一些属性和方法可以用来自定义编辑模式的使用. 当一个单元格处于 ...

  3. Spread for Windows Forms高级主题(5)---数据处理

    2019独角兽企业重金招聘Python工程师标准>>> 使用表单的API处理数据 你可以将数据以有格式或无格式字符串或者数据对象的形式填充到单元格中.将数据填充到单元格的最好方式取决 ...

  4. Spread for Windows Forms高级主题(7)---自定义打印的外观

    2019独角兽企业重金招聘Python工程师标准>>> 表单打印的多个部分都可以进行自定义,大多数的自定义选项存在于PrintInfo对象中.大多数打印选项是在PrintInfo对象 ...

  5. 分享21款漂亮的WordPress高级主题

     WordPress 是最流行的博客系统,各种主题非常多,其中很多的高级主题(Premium Theme)都是要付费购买的,今天本文收集到21款免费的 WordPress 高级主题分享给大家. Bol ...

  6. Spread for Windows Forms高级主题(6)---数据绑定管理

    自定义列和区域的数据绑定 当表单被绑定到一个数据集时,表单中的列就会相继的被分配到数据集的区域上.例如,第一个数据域分配给列A,第二个数据区域分配给列B,等等.你也可以改变分配顺序,将任意域分配给任意 ...

  7. Spread for Windows Forms高级主题(4)---自定义用户交互

    你可以从多方面自定义用户界面来自定义用户与Spread控件的交互方式.同时,你还可以自定义如何处理用户交互方式. 设置允许用户进行的操作 下面的列表总结了通过控件的数据区域,你可以授权用户进行的操作( ...

  8. android开发笔记之高级主题—传感器的简单介绍

    今天我们开始进入讲解android中的一些高级主题的用法,比如传感器.GPS.NFC.语音和人脸识别等. 这次来对传感器的一个简单介绍: Android平台支持三大类的传感器: 位移传感器 这些传感器 ...

  9. ExoPlayer详解——高级主题(官方文档)

    ExoPlayer详解系列文章 ExoPlayer详解--入门(官方文档) ExoPlayer详解--媒体类型(官方文档) ExoPlayer详解--高级主题(官方文档) 一.数字版权管理 ExoPl ...

最新文章

  1. linux 检索全部文件中的中文词汇,linux – 获取所有文件中的单词计数
  2. 怎么求人眼图像中的噪声
  3. Java集合:ConcurrentHashMap(JDK 1.7 JDK 1.8)
  4. awr报告分析 mysql_4个MySQL优化工具,帮你准确定位数据库瓶颈!
  5. Android启动initlogo.rle制作
  6. Alibaba Nacos 介绍以及服务提供者工程接入nacos注册中心
  7. Bailian4036 计算系数【数学+迭代】
  8. DesignPattern_Java:设计模式分类和设计原则
  9. Atitit 架构的艺术 目录 1. 按照技术站分类 1 1.1. LAMP架构,到IOE架构,再到分布式架构 1 1.2. Ssh ssm 1 2. Bs cs web hybrid架构 1 3.
  10. 说明assert()的作用:assert()是一个调试程序时经常使用的宏,在程序执行时计算括号内的表达式,如果表达式为假,程序报告错误,并终止执行;若表达式为真,则继续执行后面的语句。
  11. SPSS基础教程:认识SPSS的主要窗口
  12. 接口性能测试方案分析
  13. Linux Command diff 文件比较
  14. swal()弹出删除确认框
  15. 聚类分析及R编程实现
  16. npm install 安装软件,出现 operation not permitted, mkdir
  17. 常量与变量有哪些区别
  18. js怎么把字符串转数字
  19. 计算机科学与技术专业用英文版,计算机科学与技术专业专业英文简历模板
  20. 条形码控件字体的工具包Code 39 Font Advantage Package

热门文章

  1. Android studio实现计算BMI指数(两个页面之间的跳转)
  2. 公路领域新型基础设施建设报告(附下载)
  3. python不同版本中浮点除法和整数除法
  4. Java | 局部变量(Local Variable)
  5. Matlab——二进制转十进制(包含小数转换)
  6. 代数小课堂:线性代数(矩阵的用途,提高批处理问题的能力)
  7. idea上多次commit合并
  8. php array_diff菜鸟,TCGA
  9. 基于JAVAvue健身食谱系统计算机毕业设计源码+数据库+lw文档+系统+部署
  10. 如何使用163的SMTP服务发邮件?