I am using golang and I am trying to read time from mysql and I am getting the following error.
var my_time time.Time rows, err := db.Query("SELECT current_time FROM table") err := rows.Scan(&my_time)
The error I am getting is
unsupported driver -> Scan pair: []uint8 -> *time.Time
How can I fix this?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Assuming you’re using the go-sql-driver/mysql
you can ask the driver to scan DATE and DATETIME automatically to time.Time
, by adding parseTime=true
to your connection string.
See https://github.com/go-sql-driver/mysql#timetime-support
Example code:
db, err := sql.Open("mysql", "root:@/?parseTime=true") if err != nil { panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic } defer db.Close() var myTime time.Time rows, err := db.Query("SELECT current_timestamp()") if rows.Next() { if err = rows.Scan(&myTime); err != nil { panic(err) } } fmt.Println(myTime)
Notice that this works with current_timestamp
but not with current_time
. If you must use current_time
you’ll need to do the parsing youself.
This is how you do custom parsing:
First, we define a custom type wrapping []byte, that will automatically parse time values:
type rawTime []byte func (t rawTime) Time() (time.Time, error) { return time.Parse("15:04:05", string(t)) }
And in the scanning code we just do this:
var myTime rawTime rows, err := db.Query("SELECT current_time()") if rows.Next() { if err = rows.Scan(&myTime); err != nil { panic(err) } } fmt.Println(myTime.Time())
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0