Gorm查询语句报错

Gorm报错:"sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time"

查了很多资料都是在dsn中添加 parseTime=True ,我已经添加了但仍然报错
一下是连接初始化:

conf := config.Conf.Mysql
    var err error
    Database, err = gorm.Open(
        mysql.Open(fmt.Sprintf("%s:%s@tcp(%s)/go?charset=utf8&parseTime=True", conf.Username, conf.Password, conf.Host)),
        &gorm.Config{})
    if err != nil {
        log.Fatalln("数据库连接错误")
    }

下面是查询语句:

        var user model.User
    if err := model.Database.Where("username=?", service.Username).First(&user).Error; err != nil {
        log.Println(err)
        return serializer.Response{
            Status: 200,
            Msg:    "用户不存在",
            Error:  err.Error(),
        }
    }

你数据库的 create_at 字段是什么类型? User结构体里面的对应字段是什么类型?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题是由于Gorm在从MySQL数据库中查询数据时尝试将一个[]uint8类型的数据转换为*time.Time类型引起的。

    要解决这个问题,你可以使用自定义的Scan函数来处理这种转换。你可以在模型结构体的定义中为created_at字段添加一个Scan函数。

    下面是解决这个问题的步骤和代码示例:

    1. 在你的模型结构体中,为created_at字段添加一个Scan函数。这个函数将根据需要进行类型转换。代码示例:
    type User struct {
        ID        uint      `gorm:"primaryKey"`
        Username  string    `gorm:"unique"`
        CreatedAt time.Time `gorm:"autoCreateTime"`
    }
    
    func (u *User) Scan(value interface{}) error {
        switch v := value.(type) {
        case []uint8:
            parsedTime, err := time.Parse("2006-01-02 15:04:05", string(v))
            if err != nil {
                return err
            }
            u.CreatedAt = parsedTime
        case time.Time:
            u.CreatedAt = v
        default:
            return errors.New("unsupported value type for created_at field")
        }
        return nil
    }
    
    1. 在查询之前,确保模型的定义中已经引入了该Scan函数。

    2. 确保数据库连接时没有缺少parseTime=True选项。你可以通过在DSN字符串中添加?parseTime=True来确保。

    以上是解决这个问题的方法。希望对你有帮助。如果有任何疑问,请随时问我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^