【mysql】parseTime=true 参数说明以及如何在 GORM 中使用它避免 Scan error on column...: unsupported Scan 错误的方法。

发布时间 2023-06-25 23:18:59作者: 若-飞

什么是 parseTime=true 参数

parseTime=true 是一个 MySQL 数据库连接参数,它告诉 MySQL 驱动程序将日期时间类型的值解析为 time.Time 类型。在 MySQL 中,日期时间类型的值可以表示为字符串,例如 2022-07-01 13:30:00。默认情况下,MySQL 驱动程序将这些值作为 []uint8 类型返回,这可能会导致类型转换错误。

为了避免类型转换错误,您可以在连接 MySQL 数据库时将 parseTime=true 参数设置为 true。这将告诉 MySQL 驱动程序将日期时间类型的值解析为 time.Time 类型,从而使 GORM 能够正确地将日期时间类型的值转换为 time.Time 类型,而不是 []uint8 类型。

解决 "Scan error on column...: unsupported Scan" 错误

如果您的 GORM 模型中包含日期时间类型的字段,并且您在连接 MySQL 数据库时未设置 parseTime=true 参数,则当您从数据库中检索日期时间类型的值时,您可能会遇到以下错误:

pgsql
Scan error on column index 10, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time

这是因为 MySQL 驱动程序将日期时间类型的值作为 []uint8 类型返回,而 GORM 无法将 []uint8 类型的值转换为 time.Time 类型。

为了解决这个错误,您可以在连接 MySQL 数据库时设置 parseTime=true 参数,例如:

go
import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)

dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=true"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

这将告诉 MySQL 驱动程序将日期时间类型的值解析为 time.Time 类型,从而避免了将 []uint8 类型的值存储到 *time.Time 类型的字段中导致的错误。

如果您无法更改连接字符串中的参数,您也可以在 GORM 模型中将日期时间类型的字段定义为 *time.Time 的指针类型,例如:

go
import (
    "time"
    "gorm.io/gorm"
)

type UserModel struct {
    gorm.Model
    Name      string
    Age       int
    CreatedAt *time.Time
    UpdatedAt *time.Time
}

这样,GORM 将日期时间类型的值作为 []uint8 类型返回,但是由于这些字段是 *time.Time 类型的指针,因此 GORM 可以正确地将日期时间类型的值转换为 time.Time 类型。

希望这篇博客能够帮助您更好地理解 parseTime=true 参数的作用,以及如何在 GORM 中使用它避免 Scan error on column...: unsupported Scan 错误。如果您有其他问题或需要进一步帮助,请随时向我提问。