LoginSignup
8
5

More than 5 years have passed since last update.

MySQLのTIME型をGoの*time.Time型で扱おうとたらscan error on column

Posted at

前提

DBはMySQL。
ORMはgorpを使用している。
DNSには?parseTime=trueが入ってる。

問題

テーブルにDATE型(日付)とTIME型(時刻)のカラムがそれぞれあって。

CREATE TABLE `post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL,
  `time` time DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

GoのstructではDate,Timeの両方とも*time.Time型にしている。

type Post struct {
    Id   int64
    Date *time.Time
    Time *time.Time
}

gorpを使って、DBから取得したデータをPost(Goのstruct)に格納するわけだ。

query := "SELECT * FROM post"
var list []Post
_, err := DbMap.Select(&list, query)

したらScan error on columnと怒られる。

sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *time.Time

対処法

SQLの方を修正。 ADDTIMEで日付と時刻を足しあわせ、DATETIME型にCASTする。

SELECT id, date, CAST(ADDTIME(date, time) AS DATETIME) datetime FROM post

他にもっと良い方法があれば教えてください。

参考

Go言語のMySQLドライバでTIME型のカラムのデータを受け取りたいとき
GolangでScan errorが出た時の対応

8
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5