查了很多资料都是在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结构体里面的对应字段是什么类型?
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题是由于Gorm在从MySQL数据库中查询数据时尝试将一个[]uint8类型的数据转换为*time.Time类型引起的。
要解决这个问题,你可以使用自定义的Scan函数来处理这种转换。你可以在模型结构体的定义中为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
}
在查询之前,确保模型的定义中已经引入了该Scan函数。
确保数据库连接时没有缺少parseTime=True选项。你可以通过在DSN字符串中添加?parseTime=True
来确保。
以上是解决这个问题的方法。希望对你有帮助。如果有任何疑问,请随时问我。