5 GROM 高级主题 (golang)
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 在运行 Row
或 Rows
时被调用,默认情况下它没有注册的回调,你可以注册一个新的回调:
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 接口。
某些数据库可能兼容 mysql
或 postgres
方言,此时你可以直接使用现有方言。
方言的特殊类型
某些 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)相关推荐
- Redis 高级主题之布隆过滤器(BloomFilter)
最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...
- Spread for Windows Forms高级主题(3)---单元格的编辑模式
理解单元格的编辑模式 通常情况下,当终端用户双击单元格时,编辑控件将允许用户在该单元格中输入内容.在一个单元格中编辑的能力被称为编辑模式.一些属性和方法可以用来自定义编辑模式的使用. 当一个单元格处于 ...
- Spread for Windows Forms高级主题(5)---数据处理
2019独角兽企业重金招聘Python工程师标准>>> 使用表单的API处理数据 你可以将数据以有格式或无格式字符串或者数据对象的形式填充到单元格中.将数据填充到单元格的最好方式取决 ...
- Spread for Windows Forms高级主题(7)---自定义打印的外观
2019独角兽企业重金招聘Python工程师标准>>> 表单打印的多个部分都可以进行自定义,大多数的自定义选项存在于PrintInfo对象中.大多数打印选项是在PrintInfo对象 ...
- 分享21款漂亮的WordPress高级主题
WordPress 是最流行的博客系统,各种主题非常多,其中很多的高级主题(Premium Theme)都是要付费购买的,今天本文收集到21款免费的 WordPress 高级主题分享给大家. Bol ...
- Spread for Windows Forms高级主题(6)---数据绑定管理
自定义列和区域的数据绑定 当表单被绑定到一个数据集时,表单中的列就会相继的被分配到数据集的区域上.例如,第一个数据域分配给列A,第二个数据区域分配给列B,等等.你也可以改变分配顺序,将任意域分配给任意 ...
- Spread for Windows Forms高级主题(4)---自定义用户交互
你可以从多方面自定义用户界面来自定义用户与Spread控件的交互方式.同时,你还可以自定义如何处理用户交互方式. 设置允许用户进行的操作 下面的列表总结了通过控件的数据区域,你可以授权用户进行的操作( ...
- android开发笔记之高级主题—传感器的简单介绍
今天我们开始进入讲解android中的一些高级主题的用法,比如传感器.GPS.NFC.语音和人脸识别等. 这次来对传感器的一个简单介绍: Android平台支持三大类的传感器: 位移传感器 这些传感器 ...
- ExoPlayer详解——高级主题(官方文档)
ExoPlayer详解系列文章 ExoPlayer详解--入门(官方文档) ExoPlayer详解--媒体类型(官方文档) ExoPlayer详解--高级主题(官方文档) 一.数字版权管理 ExoPl ...
最新文章
- linux 检索全部文件中的中文词汇,linux – 获取所有文件中的单词计数
- 怎么求人眼图像中的噪声
- Java集合:ConcurrentHashMap(JDK 1.7 JDK 1.8)
- awr报告分析 mysql_4个MySQL优化工具,帮你准确定位数据库瓶颈!
- Android启动initlogo.rle制作
- Alibaba Nacos 介绍以及服务提供者工程接入nacos注册中心
- Bailian4036 计算系数【数学+迭代】
- DesignPattern_Java:设计模式分类和设计原则
- Atitit 架构的艺术 目录 1. 按照技术站分类	1 1.1. LAMP架构,到IOE架构,再到分布式架构	1 1.2. Ssh ssm	1 2. Bs cs web hybrid架构	1 3.
- 说明assert()的作用:assert()是一个调试程序时经常使用的宏,在程序执行时计算括号内的表达式,如果表达式为假,程序报告错误,并终止执行;若表达式为真,则继续执行后面的语句。
- SPSS基础教程:认识SPSS的主要窗口
- 接口性能测试方案分析
- Linux Command diff 文件比较
- swal()弹出删除确认框
- 聚类分析及R编程实现
- npm install 安装软件,出现 operation not permitted, mkdir
- 常量与变量有哪些区别
- js怎么把字符串转数字
- 计算机科学与技术专业用英文版,计算机科学与技术专业专业英文简历模板
- 条形码控件字体的工具包Code 39 Font Advantage Package