한번 migration up으로 반영한 뒤에는 다시 반영할 수 없다.
수정을 하려면 down으로 반영 취소한 다음에 다시 up으로 반영해야하는데
권장하지는 않는다.
보통 create에 대한 down은 drop table이므로 data가 다 날아간다.
따라서 alter table을 하는 경우는 추가로 fizz파일을 생성하도록 한다.
1. Model 생성
명령어 : buffalo pop g model "모델명"
여기에서 모델명은 단수로 적는다.
실제 db에 생성되는 table명은 복수로 's'가 붙는다.
예) buffalo pop g model region
이러면 /models/region.go 가 생성되고
DB에는 regions 라는 table이 생성된다.
table에는 id, created_at, updated_at 세 칼럼이 기본으로 추가된다.
2. table 변경
명령어 : buffalo pop g fizz "작업구분_테이블명"
구분을 하기위한 이름이고 해당 이름기준으로 순번_이름_up.fizz 와 _down.fizz 파일이 생성된다.
예) 테이블명이 regions 이고 columng을 추가할 것임
buffalo pop g fizz update_regions
명령을 실행하면 20230101_update_regions_down.fizz 와 20230101_update_regions_down.fizz 두 개의 빈 파일이 생성된다.
각 파일을 수정한다
20230101_update_regions_down.fizz 에는
drop_column("regions", "test")
20230101_update_regions_up.fizz 에는
add_column("regions", "test", "string", {} )
저장 한 뒤에 적용
buffalo pop migrate up
테이블을 확인해보면 regions 테이블에 test라는 칼럼이 추가된 것이 확인된다.
변경사항은 다음 내용을 따른다.
테이블 삭제 | drop_table("테이블명") | drop_table("regions") |
테이블명 변경 | rename_table("테이블명", "바꿀 테이블 명") | rename_table("regions", "new_regions") |
칼럼 추가 | add_column("테이블명", "칼럼명", "data타입", {}) | add_column("regions", "desc", "int", {} ) |
칼럼 변경 | change_column("테이블명", "칼럼명", "data타입", {}) | change_column("regions", "desc", "string", {} ) |
칼럼 삭제 | drop_column("테이블명", "칼럼명" ) | drop_column("regions", "desc" ) |
인덱스 추가 (단일칼럼) |
add_index("테이블명", "칼럼명", {} ) -> index명 : 테이블명_칼럼명_idx |
add_index("regions", "abc", {} ) -> regions_abc_idx |
인덱스 추가 (복수칼럼) |
add_index("테이블명", ["칼럼1", "칼럼2"], {} ) | add_index("regions", ["abc", "def"], {} ) |
unique 인덱스 | add_index("테이블명", "칼럼명", {"unique":true} ) | add_index("regions", "abc", {"unique" : true } ) |
인덱스 이름지정 | add_index("테이블명", "칼럼명", {} ) -> 기본이름 add_index("테이블명", "칼럼명", { "name" : "인덱스이름"} ) -> 인덱스 이름으로 생성 |
add_index("regions", "abc", { "name" : "i_abc" } ) -> i_abc (이름 지정 안했으면 : regions_abc_idx ) |
인덱스 이름 변경 | rename_index("테이블명", "인덱스명", "바꿀인덱스명") | rename_index("regions", "i_abc", "idx_abc") |
인덱스 삭제 | drop_index("테이블명", "인덱스명") | drop_index("regions", "i_abc") |
fk 추가 | add_foreign_key("테이블명", "칼럼으로 쓸 이름", {"참조 테이블명" | ["참조칼럼명"]}, { "name" : fk이름" }) | add_foreign_key("regions", "parent_id", { "csp" : "id"]}, "name" : "fk_regions_csp_id"} ) |
fk 삭제 | drop_foreign_key("테이블명", "칼럼명", {"if_exists":true}) | drop_foreign_key("regions", "fk_regions_csp_id", {"if_exists": true}) |
3. model 변경
model은 처음 생성할 때 빼고는 변경되지 않음 따라서 변경내용을 직접 변경해야함.
최초 생성시 |
type Region struct {
ID uuid.UUID `json:"id" db:"id"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
|
변경내용 반영 |
type Region struct {
ID uuid.UUID `json:"id" db:"id"`
ParentID uuid.UUID `json:"parent_id" db:"parent_id"`
CSP *CSP `belongs_to:"csp"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
|
참고1 : 최초 모델 생성 시 db에 반영은 되나 migration up 은 안되어 있는 상태임.
필요내용을 직접 수정 한 다음 migration up을 하면 1번은 반영이 됨.
참고2 : generate model로 여러 model을 생성부터 먼저하고 migration up을 하면 한번에 적용 됨.
migration up으로 한번 반영이 되면 down으로 내리거나 새로운 파일을 생성하여 적용해야 함.
결론
변경내용 기록을 위해서도 변경내용은 매번 buffalo pop g fizz "작업구분_테이블명" 으로 추가한다.
기존내역은 재반영 되지 않는다.