#はじめに結論
SQLBoilerとMySQLドライバ(go-sql-driver/mysql)の使い方でハマりました・・・。
結論から先に言いますと、DB接続する際以下に示すようにDSNにparseTime=true
っていうパラメータを付与してあげてください。
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3300)/todos?parseTime=true")
前提
環境
- Windows10
- Go v1.13.7
- Gin v1.5.0
- SQLBoiler v3
- MySQL 8.0.18
ソース
DB
CREATE TABLE `tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_name` varchar(45) NOT NULL,
`status` int(11) NOT NULL,
`created_by` varchar(45) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
#やろうとしたこと
DBからデータを取ってきてブラウザに表示しようとしただけです。
Golangやりたいなと思ったので試しにtodoリストを作ってました。
#発生した問題
以下のようなエラーが出て困りました。
failed to assign all query results to Task slice: failed to bind pointers to obj: sql: Scan error on column index 4, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time
MySQLのDATETIME型のカラムを、SQLBoilerが自動生成してくれた構造体のtime.Time型のフィールドに読み込もうとして失敗しました。
#原因
上記リンクによると、MySQLのDATEとDATETIMEはGoで出力するとデフォルトは[]byteになるよって書いてあります。よく読んでない私がダメでしたね(´;ω;`)
#解決策
前段のリンクから、
DSNのパラメータにparseTime=trueを付与すると、time.Time型で扱えるとあります。
また、locパラメータでロケーションも設定できるみたいです。