あいつの日誌β

働きながら旅しています。

golang: gorm で 日付を定義したい

User.birthday や Diary.ymd みたいな date 型を指定したい場合は struct を以下のようにすれば良いらしい。 Update するときは Query に hms つけた状態でも ymd だけ更新されます。 Find するときは ymd 形式に変えてあげればいいと思います。

package main

import (
    "fmt"
    "time"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

type Diary struct {
    ID    int
    Title string
    Ymd   time.Time `sql:"not null;type:date"`
}

func main() {
    db, err := gorm.Open("mysql", "root:@/go_tutorial?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }
    db.LogMode(true)
    db.AutoMigrate(&Diary{})
    db.Delete(&Diary{})
    ymd := time.Date(2014, time.December, 31, 0, 0, 0, 0, time.UTC)
    db.Create(&Diary{Title: "titile", Ymd: ymd})

    var diary Diary
    err = db.Where("ymd = ?", ymd.Format("2006-01-02")).First(&diary).Error
    if err != nil {
        panic(err)
    }
    newYmd := time.Date(2015, time.December, 31, 0, 0, 0, 0, time.UTC)
    diary.Ymd = newYmd
    db.Save(diary)

    err = db.Where("ymd = ?", newYmd.Format("2006-01-02")).First(&diary).Error
    if err != nil {
        panic(err)
    }

    fmt.Println(diary)
}

実行結果

[2016-11-16 16:37:13]  [0.36ms]  DELETE FROM `diaries`
[2016-11-16 16:37:13]  [0.44ms]  INSERT INTO `diaries` (`title`,`ymd`) VALUES ('titile','2014-12-31T00:00:00Z')
[2016-11-16 16:37:13]  [0.50ms]  SELECT * FROM `diaries`  WHERE (ymd = '2014-12-31') ORDER BY `diaries`.`id` ASC LIMIT 1
[2016-11-16 16:37:13]  [0.66ms]  UPDATE `diaries` SET `title` = 'titile', `ymd` = '2015-12-31T00:00:00Z'  WHERE `diaries`.`id` = '13'
[2016-11-16 16:37:13]  [0.59ms]  SELECT * FROM `diaries`  WHERE `diaries`.`id` = '13' AND ((ymd = '2015-12-31')) ORDER BY `diaries`.`id` ASC LIMIT 1
{13 titile 2015-12-31 00:00:00 +0900 JST}