mysql 如何在GORM中使用数据库中的类型“time”?

w8ntj3qf  于 2023-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(376)

在我的结构中,我有一个这样的字段:

type model struct {
    gorm.Model
    Time *time.Time `gorm:"type:time"`
}

事实证明,从我所看到的,GORM 使用 Go 本身的time类型,而不是数据库的time类型,这是我的意图。
这将使用Debug()函数生成以下 sql

CREATE TABLE `models` (`time` datetime(3) NULL)

而不是:

CREATE TABLE `models` (`time` time NULL)

我所期望的就是想要。
如何让它工作?
即使阅读文档和其他论坛,我所尝试的一切都是无用的。

eyh26e7m

eyh26e7m1#

这是GORM数据库类型Map的默认行为。
GORM中,type:"time"中的time被视为一个关键字,用于将默认数据库列类型设置为mysql的datetime或postgresql的timestamptz
图式

// GORM fields types
const (
    ....
    Time   DataType = "time"
    Bytes  DataType = "bytes"
)
    • 用于MySQL**
case schema.Time: 
        return dialector.getSchemaTimeType(field)
func (dialector Dialector) getSchemaTimeType(field *schema.Field) string {
    .... 

    if field.NotNull || field.PrimaryKey {
        return "datetime" + precision
    }
    return "datetime" + precision + " NULL"
}
    • 用于海报**
....

case schema.Time:
        if field.Precision > 0 {
            return fmt.Sprintf("timestamptz(%d)", field.Precision)
        }
    • 设置为time的解决方案**

您可以使用GORM提供的customisation方法。
GORM将从标签类型读取列的数据库type,如果没有找到,将检查结构是否实现接口GormDBDataTypeInterfaceGormDataTypeInterface,并将其结果用作数据类型
下面是代码片段

type model struct {
    gorm.Model
    Time CustomTime
}

type CustomTime struct {
    time.Time
}

func (CustomTime) GormDataType() string {
    return "time"
}

func (CustomTime) GormDBDataType(db *gorm.DB, field *schema.Field) string {
    return "time"
}

相关问题