go-carbon 和 gorm 优雅处理数据库日期时间

news/2024/11/6 3:48:02 标签: golang

一、简介

(一) carbon

carbon 是一个简单、语义化、开发人员友好的 golang 时间包。carbon 提供了丰富的日期和时间处理功能,使得日期和时间操作更加简单和直观。

(二) gorm

gorm 是一个用于 Go 语言的 ORM(对象关系映射)框架。它提供了简洁的 API 来操作数据库,支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),并且具有良好的性能和扩展性。

二、基本使用

(一) Carbontime.Time 互转
// 将标准 time.Time 转换成 Carbon
carbon.CreateFromStdTime(time.Now())
// 将 Carbon 转换成标准 time.Time
carbon.Now().StdTime()
(二) 与 gorm 配合使用
1. time.Time

以往我们定义模型中时间日期字段类型为 time.Time

type User struct {
    ID        uint
    Name      string
    Email     string
    CreatedAt time.Time
    UpdatedAt time.Time
}

但是在一些场景下比如我们要把查询出来的数据 CreatedAtUpdatedAt 转成int64(时间戳) 给前端,这时候需要额外写代码将其转化。

users, err = query.User.WithContext(context.Background()).FindAll()
if err != nil {
    return nil, err
}

var resp []Resp
for _, user := range users {
    resp = append(resp, Resp{
        ID:        user.ID,
        Name:      user.Name,
        Email:     user.Email,
        CreatedAt: user.CreateTime.UnixMilli(),
        UpdatedAt: user.CreateTime.UnixMilli(),
    })
}
return resp, nil
2. carbon.TimestampMilli

我们只需要修改一下 CreatedAtUpdatedAt类型为 carbon.TimestampMilli 就可以了

type User struct {
    ID        uint
    Name      string
    Email     string
    CreatedAt carbon.TimestampMilli
    UpdatedAt carbon.TimestampMilli
}

同样的需求只要gorm 查询 ,carbon 就会自己将我们的 time.Time 转成int64(时间戳)

users, err = query.User.WithContext(context.Background()).FindAll()
if err != nil {
    return nil, err
}

// [{Key:1 Value:{"id":1,"name":"admin","email":"test@test.com", "created_at":1678734089000,"updated_at":1730681347000}}]
3. 创建日期对象
query.User.WithContext(context.Background()).Create(&model.User{
		Name:       "carbon",
		Email:      "carbon",
		CreateTime: carbon.Now().ToTimestampMilliStruct(),
		UpdateTime: carbon.Now().ToTimestampMilliStruct(),
})

三、总结

carbongorm 是 Go 语言中非常有用的库,分别用于日期和时间操作以及数据库操作。通过结合这两个库,可以简化开发过程,提高代码的可读性和可维护性


http://www.niftyadmin.cn/n/5740126.html

相关文章

Java学习路线:Maven(一)认识Maven

目录 认识Maven 新建Maven文件 导入依赖 认识Maven Maven是一个Java的项目管理工具,通过Maven,我们可以实现: 项目自动构建,包括代码的编译、测试、打包、安装等依赖管理,快速完成依赖的导入 在学习Maven之前&…

Vue全栈开发旅游网项目(3)-Vue路由配置

1. 配置路由 1.1 导入路由工具 文件地址:src\router\index.js import { createRouter, createWebHistory } from vue-router//导入配置路由的工具 import HomeView from ../views/HomeView.vue//导入组件const router createRouter({//创建路由对象history: cre…

pytorch知识蒸馏测试

import torch from torch import nn,optim import torch.utils import torch.utils.data import torch.utils.data.dataloader from torchvision import transforms,datasets

FPGA实现以太网(一)、以太网基础知识

系列文章目录 文章目录 系列文章目录一、以太网简介二、OSI七层模型三、TCP/IP五层模型四、MAC-PHY接口五、MAC帧格式六、IP帧格式6.1 IP首部校验和计算6.2 IP首部校验和校验 七、UDP帧格式7.1 UDP头部校验和计算 一、以太网简介 以太网(Ethernet)是一种…

记一次:Clickhouse同步mysql数据库

ClickHouse可以通过使用MaterializeMySQL引擎来实现与MySQL的数据同步。 前言:因为数据量比较大,既然要分库,为何不让clickhouse同步一下mysql数据库呢? 零、前期准备--mysql的查询和配置 1 查询mysql的配置状态 查询以下语句…

三维测量与建模笔记 - 3.1 相机标定基本概念

成像领域有多个标定概念 笔记所说的相机标定主要是指几何标定。 相机几何模型基于小孔成像原理,相关文章很多,上图中R t矩阵是外参矩阵(和相机在世界空间中的位姿相关),K矩阵是内参矩阵(和相机本身参数相关…

【Android】Gradle 7.0+ 渠道打包配置

声明 该配置主要解决打包apk/aab需要动态修改渠道字段,方便区分渠道上架国内商店。 暂不支持批量打包(7.4版本无法通过只修改outputFileName的形式批量处理) 因为构建时需要拷贝/创建Output,然后修改outputFileName才能处理批量打包,但拷贝/创建在高版本中失效了。 目前的…

【UML】- 用例图(结合银行案例解释其中的奥义)

目录 一、相关介绍 作用: 组成: 关系 二、使用具体银行案例解释各组成部分的含义 1、系统 2、参与者 3、用例 4、关联关系 5、扩展关系 6、泛化(继承)关系 三、成品 一、相关介绍 作用: 用例图可以描述一个…