英文:
unsupported Scan, storing driver.Value type []uint8 into type *time.Time
问题
我在查询用户时遇到了困难,用户的定义如下:
type User struct {
ID int `db:"id" json:"id"`
UserName string `db:"username" json:"username"`
Email string `db:"email" json:"email"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
StatusID uint8 `db:"status_id" json:"status_id"`
Deleted uint8 `db:"deleted" json:"deleted"`
...
}
而在MariaDB中,表的定义如下:
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NA | |
| email | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | CURRENT_TIMESTAMP | |
| status_id | tinyint(1) | NO | | 0 | |
| deleted | tinyint(1) | NO | | 0 | |
...
然而,当我进行查询时,出现了以下错误:
sql: Scan error on column index 3: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
尽管表中有一些行数据。我还尝试将created_at
的类型更改为timestamp
,但仍然出现相同的错误。
所以我不知道出了什么问题?我该如何解决?
**附注:**尽管我的问题的答案与这个问题相同,但这里的上下文不同(使用的是sqlx
而不是go-sql-driver/mysql
)。而且由于这里的错误是主题,对于那些在谷歌上搜索相同错误的人来说,这可能更容易搜索到。因此,也许值得将其作为一个单独的问题保留。
英文:
I have difficulty querieing for users, which is defined as:
type User struct {
ID int `db:"id" json:"id"`
UserName string `db:"username" json:"username"`
Email string `db:"email" json:"email"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
StatusID uint8 `db:"status_id" json:"status_id"`
Deleted uint8 `db:"deleted" json:"deleted"`
...
}
And the table in MariaDB is defined as:
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NA | |
| email | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | CURRENT_TIMESTAMP | |
| status_id | tinyint(1) | NO | | 0 | |
| deleted | tinyint(1) | NO | | 0 | |
... |
However when I query it like:
func GetUsers(c *gin.Context) {
var users []model.User
err := shared.Dbmap.Select(&users, "SELECT * FROM user")
if err == nil {
c.JSON(200, users)
} else {
fmt.Println("%v \n", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "no user(s) in the table or problem in the query"})
}
// curl -i http://127.0.0.1:8080/api/v1/users
}
I get this error:
sql: Scan error on column index 3: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
while there are some rows in the table.
I have also tried created_at
as timestamp
but still get the same error.
So I'm left clueless as what wrong here? How can I fix it?
P.S. Though my question turned out to have the same answer as this but here the context is different (sqlx
instead of go-sql-driver/mysql
). Also since here the error is the subject it probably more searchable for people who google the same error. So perhaps this worth keeping as a separate question.
答案1
得分: 223
好的,我找到了解决方案,感谢这个答案。
问题是通过在数据库映射器中添加?parseTime=true
来解决的。像这样:
db, err := sqlx.Connect("mysql", "myuser:mypass@tcp(127.0.0.1:3306)/mydb?parseTime=true")
英文:
Alright, I found the solution, thanks this answer.
The problem goes by adding ?parseTime=true
to the db mapper. Like this:
db, err := sqlx.Connect("mysql", "myuser:mypass@tcp(127.0.0.1:3306)/mydb?parseTime=true")
答案2
得分: 23
在我的情况下,将代码更改为:
db, err := sql.Open("mysql", "root:@/?parseTime=true")
解决了问题。
英文:
In my case, changing to
db, err := sql.Open("mysql", "root:@/?parseTime=true")
resolved problem.
答案3
得分: 1
在我的情况下,我遇到了类似的问题,但是对于我的特定用例,它是一个包含了一个无法工作的选择(select)的结构体,因为我只需要选择数据,所以我简单地进行了以下操作:
将数据类型从time.Time
更改为string
这解决了我的问题,我能够从数据库中获取数据。
也许这不是最好的解决方案,但这是对我有效的方法。
Karlom先生的解决方案对我也有效,这只是一种替代方法。
英文:
In my case, I had a similar problem but for my particular usecase, it was a struct with a select which didn't work, since I only needed to select data, then I proceeded to simply:
change the data type from time.Time
to string
This solved my problem, and I was able to get the data from the database.
So perhaps it is not the best solution, but this is what worked for me.
Mr Karlom's solution also worked for me, this is just an alternative method.
答案4
得分: 0
如果你正在使用gorm包,可以尝试以下解决方案:
db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/db?parseTime=true")
这将修复该问题。
英文:
Another Solution if you are using gorm pkg
db, err := gorm.Open("root:root@tcp(localhost:3306)db?parseTime=true"), &gorm.Config{})
This will fix the issue
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论