golang gorm time json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang gorm time json相关的知识,希望对你有一定的参考价值。

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"github.com/jinzhu/gorm"
	"strconv"
	"time"
)

type GormBase struct {
	CreatedAt JSONTime   `json:"created_at" gorm:"type:timestamp"`
	UpdateAt  JSONTime   `json:"updated_at" gorm:"type:timestamp"`
	DeletedAt *time.Time `json:"-" gorm:"type:timestamp"`
}

type JSONTime struct {
	Time time.Time
}

/*
*@ date 2019-04-19
*@ author majianyu
*@ description only support second
 */
func (this JSONTime) MarshalJSON() ([]byte, error) {
	return json.Marshal(this.Time.Unix())
}

/*
*@ date 2019-04-19
*@ author majianyu
*@ description support second and millisecond parse
 */
func (this *JSONTime) UnmarshalJSON(b []byte) error {
	str := string(b)
	ts, err := strconv.ParseInt(str, 10, 64)
	if err != nil {
		return err
	}
	if len(str) == 10 {
		// second
		this.Time = time.Unix(ts, 0)
	} else if len(str) == 13 {
		// millisecond
		this.Time = time.Unix(0, ts*1e6)
	} else {
		return fmt.Errorf("can not convert %s to time", str)
	}
	return nil
}
func (this JSONTime) Value() (driver.Value, error) {
	var zeroTime time.Time
	if this.Time.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return this.Time, nil
}
func (this *JSONTime) Scan(v interface{}) error {
	value, ok := v.(time.Time)
	if ok {
		*this = JSONTime{Time: value}
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)

}

func (g *GormBase) BeforeUpdate(scope *gorm.Scope) error {
	scope.SetColumn("UpdateAt", time.Now())
	return nil
}

func (g *GormBase) BeforeCreate(scope *gorm.Scope) error {
	if g.UpdateAt.Time.Unix() <= 0 {
		scope.SetColumn("UpdateAt", time.Now())
	}

	scope.SetColumn("CreatedAt", time.Now())
	return nil
}

type Report struct {
	tableName struct{}   `sql:"toptutor.report"`
	CourseID  string     `json:"course_id" gorm:"type:uuid"`
	OrderID   string     `json:"order_id" gorm:"type:uuid"`
	Questions []Question `json:"questions" gorm:"type:jsonb"`
	gormstruct.GormBase
}
type Question struct {
	ID         int    `json:"id"`
	Question   string `json:"question"`
	Answer     string `json:"answer"`
	ZhQuestion string `json:"zh_question"`
	ZhAnswer   string `json:"zh_answer"`
}

func (this *Question) Scan(v interface{}) error {
	value, ok := v.([]byte)
	if ok {
		q := Question{}
		err := json.Unmarshal(value, &q)
		if err != nil {
			return fmt.Errorf("can not convert %v to Question", v)
		}
		*this = q
		return nil
	}
	return fmt.Errorf("can not convert %v to Question", v)
}
func (this Question) Value() (driver.Value, error) {
	bytes, err := json.Marshal(this)
	if err != nil {
		return nil, err
	}
	return bytes, nil
}

使用 golang-migrate/migrate 进行 Gorm 迁移

【中文标题】使用 golang-migrate/migrate 进行 Gorm 迁移【英文标题】:Gorm Migration using golang-migrate/migrate 【发布时间】:2021-02-07 02:44:42 【问题描述】:

我决定使用gorm 作为我的 ORM。我想使用golang-migrate/migrate 进行迁移,因为看起来 GORM 没有版本化的迁移文件。我宁愿使用 CLI 进行迁移,而不是使用自动迁移。

我阅读了 gorm 文档,但没有看到 gorm 如何将模型转换为 SQL 表。有没有关于为 gorm 生成的 SQL 表的示例或文档? (尤其是类型或关联如何映射到 SQL)

【问题讨论】:

这是你要找的gorm.io/docs/migration.html#Auto-Migration吗?它说:“AutoMigrate 将创建表,缺少外键、约束、列和索引。如果现有列的大小、精度、可为空发生更改,它将更改现有列的类型。它不会删除未使用的列以保护您的数据。”跨度> 嘿伙计!您是否设法使用 CLI 运行迁移? 【参考方案1】:

阅读 gorm 文档,但我没有看到 gorm 如何将模型转换为 SQL 表。有没有关于为 gorm 生成的 SQL 表的示例或文档? (尤其是类型或关联如何映射到 SQL)

看Declaring Models段:

列数据类型,喜欢使用兼容的通用类型,例如:bool、int、uint、float、string、time、bytes,适用于所有数据库,可以和其他标签一起使用,比如not null、size , autoIncrement... 指定数据库数据类型如varbinary(8) 也支持,使用指定数据库数据类型时,需要是全数据库数据类型,例如:MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT

例如

type Post struct 
  ID     uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
  Title  string
  Tags   pq.StringArray `gorm:"type:text[]"`

??另外,请看Customize Data Types段落。

【讨论】:

以上是关于golang gorm time json的主要内容,如果未能解决你的问题,请参考以下文章

golang修仙记之gorm

golang中orm或gorm或json序列化结构体时零值的处理

golang中orm或gorm或json序列化结构体时零值的处理

学习笔记Golang之Gorm学习笔记

Gorm 预加载及输出处理- 自定义时间格式

gorm的Find