-
golang postgresql migrate 설정하기Golang 2022. 3. 21. 22:56
계기
개발 초기에 DB schema 변경이 잦고 이에 따라 Table을 drop 하고 create할 일이 많은데 이를 편하게 하기 위해 적용하게 되었다.
적용
우선 정상적으로 동작하는 postgresql DB 서버가 필요하다. 이는 그냥 docker로 간단하게 켜서 확인하면 된다.
migrate CLI: migrate/cmd/migrate at master · golang-migrate/migrate (github.com)
GitHub - golang-migrate/migrate: Database migrations. CLI and Golang library.
Database migrations. CLI and Golang library. Contribute to golang-migrate/migrate development by creating an account on GitHub.
github.com
Mac 환경에서 작업했기에 아래와 같이 install 했다.
$ brew install golang-migrate
Migrate를 위해서 설정해야할 작업은 아래와 같다.
- Create Migrate
- Create Table
- Create Key / index
- Insert Data
1. Create Migrate
migrate create -ext sql -dir db/migration -seq ${내가 생성할 seq 이름}
이제 아래의 두개의 file이 생성된다.
- 000001_${내가 생성할 seq 이름}.down.sql
- 000001_${내가 생성할 seq 이름}.up.sql
이제 파일의 내용을 채우고 아래와 같은 커맨드로 seq를 동작시킬 수 있다.
2. Create Table
xxx.up.sql file을 아래와 같이 채운다.
CREATE TABLE "users" ( "uid" bigserial PRIMARY KEY, "email" varchar NOT NULL, "name" varchar NOT NULL, "phone" varchar NOT NULL, "profile_uri" varchar NOT NULL, "school" bigserial NOT NULL, );
3. Create Key / index
xxx.up.sql file을 아래와 같이 채운다.
CREATE INDEX ON "users" ("uid"); ALTER TABLE "users" ADD FOREIGN KEY ("school") REFERENCES "schools" ("uid");
4. Insert Data
xxx.up.sql file을 아래와 같이 채운다.
INSERT INTO users (name, email, phone, profile_uri, school) values ('JH', 'test@gmail.com', '+821011111111', 'http://image.com', 1)
5. Drop Table
xxx.down.sql file을 아래와 같이 채운다.
DROP TABLE IF EXISTS users;
6. Migrate Up
cmd창에 아래와 같이 입력하면 xxx.up.sql file에 작성한 과정을 진행한다. 이 때, 마지막 숫자 1은 "000001_${내가 생성할 seq 이름}.down.sql" 에서 seq number 000001을 의미한다 만약 000001을 넘어서 숫자가 있다면 그 숫자에 맞게 변경해주면 된다 ex) 000002까지 있다면 (migrate -path ./db/migration -database "dburl" up 2)
migrate -path ./db/migration -database "dburl" up 1
7. Migrate Down
migrate -path ./db/migration -database "dburl" down 1
만약 Migrate up or down에서 문제가 발생하여 dirty ... 하는 error가 발생한다면 아래와 같은 명령어로 force 처리 후 에러를 해결하고 정상적으로 동작시키면 된다.
migrate -path ./db/migration -database "dburl" force 1
'Golang' 카테고리의 다른 글
Golang GraphQL 서버 #4 (커스텀 타입 매핑하기) (0) 2022.03.22 Golang Postgresql SQLC 설정하기 (0) 2022.03.21 golang 에러 Fatal error: newproc: function arguments too large for new goroutine (0) 2021.11.14 Golang GraphQL 서버 #3 (Resolver) (0) 2021.05.01 Golang GraphQL 서버 #2 (playground) (0) 2021.04.27