首页 > 其他分享 >GORM自定义类型

GORM自定义类型

时间:2023-04-10 16:57:54浏览次数:54  
标签:err string 自定义 DateTime time 类型 GORM

GORM自定义类型

官网地址

官方也有一个用来收集自定义的类型的仓库:https://github.com/go-gorm/datatypes

场景

时间类型
初始的时间类型只有time.time类型,而我们习惯输入和展示的结构是形如 2023-04-08 12:12:12这种。
这种格式需要被程序转化为time.time类型被orm使用,从数据库查找的时候也需要做同样的转换。
// 我这里举个例子,当我收到json数据我会转成解析成如下结构体
type CreateOrderRequest struct {
	OrderId           int64          `json:"order_id"`
	PartnerId         int64          `json:"partner_id"`    //客户
	DateOrder         DateTime       `json:"date_order"`    //订购日期
	...
	Products          []OrderProduct `json:"products"`
	Note              string         `json:"note"`
}
// 其中有个我自定义的类型DateTime
type DateTime time.Time

var TimeFormats = []string{"2006-01-02 15:04:05", "20060102150405"}

func (t *DateTime) UnmarshalJSON(data []byte) (err error) {
	fmt.Println(string(data))
	// 空值不进行解析
	if len(data) == 2 {
		*t = DateTime(time.Time{})
		return
	}
	var now time.Time
	for _, format := range TimeFormats {
		// 指定解析的格式
		if now, err = time.ParseInLocation(format, string(data), time.Local); err == nil {
			*t = DateTime(now)
			return
		}
		// 指定解析的格式
		if now, err = time.ParseInLocation(`"`+format+`"`, string(data), time.Local); err == nil {
			*t = DateTime(now)
			return
		}
	}
	return
}
//当我在添加数据库时
// CreateOrder 创建订单
func CreateOrder(info global.CreateOrderRequest, login_user_id int64) (oid int64, err error) {
    ...
	order := model.SaleOrder{
		Name:              order_no,
		...
		DateOrder:         time.Time(info.DateOrder),
		...
	}
	if err = tx.Create(&order).Error; err != nil {
		tx.Rollback()
		return
	}
	...
}
//可以很方便的使用
//这种方式我比较推荐

使用自定义类型

我们可以自定义一个类型使得gorm可以直接识别字符串类型的时间格式,这里我只提供这种思路并不建议在实际情况中使用
//自定义的数据类型必须实现 Scanner 和 Valuer 接口,以便让 GORM 知道如何将该类型接收、保存到数据库

type DateTime string

// 实现 sql.Scanner 接口,Scan 将 value 扫描至
func (j *DateTime) Scan(value interface{}) error {
	*j = DateTime((value.(time.Time)).Format("2006-01-02 15:04:05"))
	return nil
}

// 实现 driver.Valuer 接口,Value 返回 json value
func (j DateTime) Value() (driver.Value, error) {
	return string(j), nil
}
//实现这两个接口方法之后我们就可以直接使用这个类型了
//查询时gorm就会直接为我们转成当前类型
type ResGroups1 struct {
    Id         int64
    Name       string
    CreateDate DateTime
}
var info ResGroups1
db.Table("res_groups").First(&info, 2)
//插入时我们就可以直接用字符串插入
type ResGroups1 struct {
    Name       string
    CreateDate DateTime
}
db.Table("res_groups").Create(&ResGroups1{Name: "123", CreateDate: "2023-03-09 06:27:45"})

最后

  • 自定义类型Github 仓库已经提供了date和time类型,但是我好像没找到datetime类型,所以自己尝试了下。
  • 没有在实战中使用,因为我现在也适应了直接使用time.time类型
  • 对于以前从PHP转go的我来说,一开始go的时间类型确实不太适应,但是慢慢的用多了之后倒是不觉得多麻烦了
  • 不局限于时间类型,其他很多gorm满足不了我们使用的时候,或者使用的时候需要经常来回处理的时候我们可以尝试自定义自己的类型以加快我们的开发速度

标签:err,string,自定义,DateTime,time,类型,GORM
From: https://www.cnblogs.com/DTCLOUD/p/17303439.html

相关文章

  • c++ stdcall 方式与 C# 传递 struct 数据类型?
    usingnamespacestd;#include<iostream>#include<thread>#include<mutex>structMyStruct{char*myString;intlength;//othermembers};#ifdef__cplusplusextern"C"{#endif__declspec(dllexport)int_......
  • 解决WebService部署时出现的“未能创建类型...”错误
       这几天正在学习WebService,但是在部署时老是出现“未能创建类型...”的错误,在IIS7.0下折腾了半天,终于成功部署,现将经验向大家奉上。   首先必须先在IIS在创建一个虚拟目录(这个就不用多说了吧),如果这个时候直接在浏览器里调用WebService就会出现......
  • vue3中的自定义指令
    1.适用到自定义指令的场景 防抖、图片懒加载、一键Copy的功能、拖拽、页面水印、权限校验、输入框自动聚焦、相对时间转换、下拉菜单2.个人需求:在后台系统中,有很多表单提交组件,其中很多限制数字且限制条件不同。最初使用oninput="value=value.replace(/[^\d]/g,'')"来显示......
  • 文件批量改名高手,文件怎么随机改名,支持自定义生成长度
    如何批量重命名多个文件呢?有没有简单一点的方法呢?小编的回答当然是有的啦,下面一起来试试这个新的技巧,希望能给大家带来帮助。所需工具安装一个文件批量改名高手文件素材若干操作步骤步骤1:运行【文件批量改名高手】,在“文件批量重命名”中,导入文件,支持多种导入文件的方式步骤2:确定都......
  • 自定义运行时异常(非检查异常)
    写一个类继承Exception或其子类,然后在其他类中使用该异常注意:自定义的异常为运行时异常,因为运行时异常为非检查异常,并不需要程序员显示的抛出异常,但是为了更好的去检测程序,所以自定义运行时异常自定义运行时异常的使用形式://自定义构造带......
  • 自定义 DNS 服务
    如果你在使用Deployment运行CoreDNS,则该Deployment通常会向外暴露为一个具有静态IP地址Kubernetes服务。kubelet使用--cluster-dns=<DNS服务IP>标志将DNS解析器的信息传递给每个容器。DNS名称也需要域名。你可在kubelet中使用--cluster-domain=<默认本地......
  • AOP配置(XML)-五种通知类型配置
         ......
  • 一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget状态管理:状态管理-自定义controller示例如下:lib\state\controller.dart/**状态管理-自定义controller**为自定义组件指定一个自定义controller后,就可......
  • 数据的基本类型
    数据类型强类型语言要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用。弱类型语言  JAVA的数据类型分为两大类基本类型(PrimitiveTYPE)引用类型(referenceTYPE)byte占1个字节范围:-128—127short占2个字节范围:-32768—32767整数类型int占4个字节范......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 08.创建主HUD & 自定义作弊指令
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本篇文章对应课程Lecture14,56-58节。本篇文章将会教你将之前创建的各种UMG控件统合到一个主控件上。此外,还会教你如何在C++中创建自定义作弊指令,并在游戏中使用控制台执行它。目录创建主HUD使用GameMode生成玩......