在 gorm 中,我们可以使用结构体中的 time.Time
类型来表示时间类型的数据。如果数据库表中存储时间的字段是 string 类型,则需要进行类型转换。
gorm 提供了一个 Callback()
方法,该方法可以注册一个回调函数,在对应操作时会被调用。我们可以在回调函数中进行数据类型转换操作。
具体实现步骤如下:
- 在模型结构体中定义两个字段:原始字符串类型的时间字段和 time.Time 类型的时间字段;
- 使用
Callback()
方法注册一个回调函数,该回调函数会在查询操作时被调用; - 在回调函数中对原始字符串类型的时间字段进行解析,并将解析后得到的 time.Time 类型的值赋给目标时间字段。
以下是示例代码:
import (
"time"
"github.com/jinzhu/gorm"
)
type User struct {
ID uint
Name string
// 原始字符串类型的时间字段
RawCreatedAt string `gorm:"column:created_at"`
// 转换后的 time.Time 类型时间字段
CreatedAt time.Time `gorm:"-"`
}
// 定义回调函数,将 RawCreatedAt 字段转为 CreatedAt 字段
func (u *User) AfterFind(tx *gorm.DB) error {
t, err := time.Parse("2006-01-02 15:04:05", u.RawCreatedAt)
if err != nil {
return err
}
u.CreatedAt = t
return nil
}
// 设置表名和主键名等信息
func (u *User) TableName() string {
return "users"
}
func main() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
var user User
db.Where("id = ?", 1).First(&user)
fmt.Println(user.CreatedAt)
}
在上述代码中,我们定义了一个名为 User 的模型结构体,其中包含原始字符串类型的时间字段 `