LoginSignup
5
4

More than 3 years have passed since last update.

SQLBoilerでMySQLのDATETIME型使おうとしたらハマった

Posted at

はじめに結論

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型のフィールドに読み込もうとして失敗しました。

原因

https://github.com/go-sql-driver/mysql#timetime-support

上記リンクによると、MySQLのDATEとDATETIMEはGoで出力するとデフォルトは[]byteになるよって書いてあります。よく読んでない私がダメでしたね(´;ω;`)

解決策

前段のリンクから、
DSNのパラメータにparseTime=trueを付与すると、time.Time型で扱えるとあります。
また、locパラメータでロケーションも設定できるみたいです。

5
4
0

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
5
4