2020. 7. 29. 10:18ㆍTrouble Shooting
GO언어 생태계의 대표적인 ORM으로 GORM을 많이들 사용하실텐데
GORM v2자료가 많이 없다보니 저도 v1이 익숙해서 v1을 사용합니다.
v1에서는 ORM Conventions라고 해서 Timestamp Tracking이 존재합니다.
http://gorm.io/docs/conventions.html#Timestamp-Tracking
GORM에서 언급된 Timestamp의 추적은 GORM CALLBACK으로 구성되있는데
https://github.com/jinzhu/gorm/blob/master/callback_create.go#L31
// updateTimeStampForCreateCallback will set `CreatedAt`, `UpdatedAt` when creating
func updateTimeStampForCreateCallback(scope *Scope) {
if !scope.HasError() {
now := scope.db.nowFunc()
if createdAtField, ok := scope.FieldByName("CreatedAt"); ok {
if createdAtField.IsBlank {
createdAtField.Set(now)
}
}
if updatedAtField, ok := scope.FieldByName("UpdatedAt"); ok {
if updatedAtField.IsBlank {
updatedAtField.Set(now)
}
}
}
}
이 CALLBACK 코드로 인하여 Nil값이 할당이 되지 않습니다.
여기서 이 콜백코드를 새로 작성하고 등록하는 과정을 통해 UpdatedAt 컬럼을 레코드 생성시 NULL 값을 할당할 수 있습니다.
package mariadb
import (
"github.com/jinzhu/gorm"
"time"
)
func UpdatedAtCallBack(scope *gorm.Scope) {
if !scope.HasError() {
now := time.Now()
if createdAtField, ok := scope.FieldByName("CreatedAt"); ok {
if createdAtField.IsBlank {
createdAtField.Set(now)
}
}
}
}
대충 위와 같이 만들어서 updatedAtField는 무시한채 createdAtField만 작성하여
레코드 생성시 CreatedAt만 현재 타임스탬프 시간이 추가되도록 반영합니다.
그런 다음 DB Connect할 때 Register를 등록합니다.
package mariadb
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"github.com/mangocoltd/carhelper-v2-users/core/models"
"log"
"os"
"strings"
)
func Connect() {
dbName := os.Getenv("DB_DEFAULT")
dataSourceName := fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
os.Getenv("DB_USER"),
os.Getenv("DB_PASS"),
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
dbName,
)
DB, err = gorm.Open("mysql", dataSourceName)
if err != nil {
fmt.Println(err)
panic("failed to connect database")
}
DB.Callback().Create().Replace("gorm:update_time_stamp", UpdatedAtCallBack)
}
위 와 같이 Create시 발동되는 Callback을 수정함으로 써 변경이 완료되는데 이상태에서
DB에 Create를 해보시면 Null값으로 작성되는 것(시간 데이터가 포함되지 않음)을 확인할 수 있습니다.
[참고]
https://stackoverflow.com/questions/60675912/how-to-set-the-timezone-of-the-database
https://github.com/jinzhu/gorm/blob/master/callback_create.go#L31
'Trouble Shooting' 카테고리의 다른 글
FCM Foreground doesn't work (0) | 2020.09.10 |
---|---|
GORM Preload시 pk말고 다른 키 지정하기 (0) | 2020.09.09 |
Go Dockerfile 멀티스테이징 scratch를 이용한 경량화 + 타임존 맞추기 (0) | 2020.06.26 |
[Mysql, MariaDB] [1292] Truncated incorrect DOUBLE value (0) | 2020.06.08 |
GORM 컬럼명 지정하기 (0) | 2020.05.14 |