GORM v1 Create시 UpdatedAt Nil(Null)값 할당하기

2020. 7. 29. 10:18Trouble 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  

http://gorm.io/docs/conventions.html#Timestamp-Tracking  

https://qiita.com/takasp/items/4cd9a69ca32e2d361881