gorm local time 으로 기록 하기

# gorm 으로 `created_at` datetime 컬럼에 값 설정시 
# UTC 시간으로 기록되는 이슈 발생했다.

# 다음과 같은 구조에서 time.Now() 값을 설정했을때
type TestInfo struct {
ID       int64
LastDate time.Time
Age       int
Name      string
Enable    bool `gorm:"not null"`
CreatedAt time.Time
}
user.CreatedAt = time.Now()

# gorm debug 창으로 표시되는 sql 문에는 local 시간으로 쿼리가 수행되었다고 나오지만
2020/11/19 21:17:32 /Users/ysoftman/workspace/test_code/golang/sql_db/sql_gorm.go:68
[1.201ms] [rows:1] INSERT INTO `test_info` (`last_date`,`age`,`name`,`enable`,`created_at`) VALUES ('2020-11-19 21:17:32.054',21,'bill',true,'2020-11-19 21:17:32.054')

# 실제 db 를 조회해보면 UTC 시간으로 저장되어 있다.
mysql> select * from  mytest.test_info;
+----+------+------+---------------------+--------+---------------------+
| id | age  | name | last_date           | enable | created_at          |
+----+------+------+---------------------+--------+---------------------+
| 23 |    0 |      | 2020-11-19 12:17:32 |      0 | 2020-11-19 12:17:32 |
+----+------+------+---------------------+--------+---------------------+
1 row in set (0.00 sec)

# 해결방법1(권장)
# db 접속 DSN 파라미터에 loc=Asia/Seoul 로 설정해야 로컬 시간값으로 설정된다.
username:password@protocol(address)/dbname?charset=utf8&parseTime=True&loc=Asia%2FSeoul

# 해결방법2
# time 값을 string 으로 저장한다. 하지만
# 기존 저장된 데이터 포맷에 의존적이라 비추
CreatedAt string 으로 선언
user.CreatedAt = time.Now().Format("2006-01-02 15:04:05")

# 테스트코드

comments:

댓글 쓰기