GORM 컬럼명 지정하기

2020. 5. 14. 21:22Trouble Shooting

개발자마다 또는 사용자마다 사용하는 코드 스타일 및 컨벤션은 제각각 다릅니다.

하지만 언어마다 권장하는 표준 방식이 존재하는데 이를테면

 

Python에서는 snake_case를

// snake_case(스네이크 케이스 표기법)
snake_case = 1
camel_case = ""
pascal_case = None

Javascript와 Go에서는 camelCase를 사용할 것을 권장합니다.

// camelCase(카멜 케이스 표기법)
// JS
snakeCase = 1
camelCase = ""
pascalCase = null

// Go
snakeCase = 1
camelCase = ""
pascalCase = nil

 

Python은 Class 명을 작성할 때는 파스칼케이스를

// Class명은 반드시 PascalCase(파스칼 케이스)
class PascalCase:
    def __init__(self):
    	pass

Go는 Struct(구조체) 명과 구조체 내부 타입을 정의할 때는 파스칼케이스를 사용할 것을 권고합니다.

// 구조체명, 구조체 변수타입 은 PascalCase(파스칼 케이스) 
type PascalCase struct {
    Pascal uint64
    Case string
}

이처럼 언어만해도 제각기 사용하는 케이스 방식이 다른데,

 

 

Django에서 models.py처럼 스키마를 정의 하는단계를

# Django에서의 스키마 정의 - python3 manage.py --database=test inspectdb

class Test(models.Model):
    snake_case = models.AutoField(primary_key=True)
    camel_case = models.Charfield(max_length=45)
    pascal_case = models.IntegerField(default=0)

 

Go에서 사용되는 GORM 에서는 구조체를 통해 이루어집니다.

이 스키마를 정의할때 구조체의 파스칼케이스를 따르게 되는데, 태그를 사용하여 json출력을 해보신분들이라면

태그로 정의할 수 있습니다.

// Go의 스키마 정의

type Test {
    SnakeCase uint64 `json:"snake_case"`
    CamelCase string `json:"camelCase"`
    PascalCase float64 `json:"PascalCase"`
}

 

하지만 json만 태그를 정의하게 될 경우 출력되는 결과만 변형될 뿐 DB에서 읽어들일때는 전혀 상관없이 동작하며,

Gorm에서는 파스칼케이스로 정의될때 자동으로 스네이크케이스로 변형하여 읽어들입니다.

// Goland의 json 태그 자동완성 상태

type Test {
    SnakeCase uint64 `json:"snake_case"`
    CamelCase string `json:"camel_case"`
    PascalCase float64 `json:"pascal_case"`
}

 

 

여기서 DB 컬럼(필드)명이 만약 스네이크 케이스가 아닌 카멜케이스나, 파스칼케이스로 정의되어 있는경우는 이 걸리기 시작하는데요.

 

 

공식 문서에서 이를 해결 하는방법이 이미 정의되어 있습니다.

https://gorm.io/docs/models.html

공식 홈페이지의 구조체 지원 태그들 가장 첫번째에 기술된 것이 바로 Column 입니다.

type Test struct {
    NameSpace string `json:"nameSpace" Column:"nameSpace"`
    SnakeCase uint64 `gorm:"Column:snake_case;UNIQUE"`
    CamelCase float64 `gorm:"Column:camelCase"`
    PascalCase int32 `gorm:"Column:Pascalcase"`
}

위 처럼 정의할 수 있으며 순서는 상관이 없습니다.

다만 Column에서 C는 반드시 대문자여야 하며, 내용물은 반드시 "으로 감싸줘야하고,

여러 구조체 태그를 명시할때는 ; 으로 구분 지어 주어야 합니다.