sql 파일을 버전별로 작성하면, history를 남겨주는 Golang migration tool 에 대해 정리해 보고자 한다.
➡️ 따라서 나의 로컬 db에서 테스트 한 후 개발이 완료되어 원격서버에 배포할 때 데이터베이스 변경 사항 적용되도록 해보자!
➡️ 따라서 versioning 관리가 되는 db migration 툴 사용해보자!
1. Golang-migrate 설치
brew install golang-migrate
https://github.com/golang-migrate/migrate
2. migration file 만들기
migrate create -ext sql -dir ./migrations -seq test_schema
3. create table은 up
파일에, rollback command는 down
파일에 작성
000001_test_schema.up.sql
CREATE TABLE users (
id BIGSERIAL primary key,
first_name TEXT not null,
last_name TEXT,
created_at TIMESTAMP default now()
);
000001_test_schema.down.sql
DROP TABLE IF EXISTS users;
4. CLI로 Migration 실행하기
migrate -source file:<path> -database 'postgresql://<username>:<password>@<host>:<port>/<db_name>?sslmode=disable' 1 up
#ex) migrate -source file:./migrations -database "postgresql://postgres:password@localhost:5432/postgres?sslmode=disable" -verbose up 1
Success! version 2가 적용되었으며, 실패하지 않았을 경우
5. 적용 후 다음 버전의 sql 파일 생성(처음 생성할 때와 똑같은 명령어 사용 시, 다음 버전의 sql 파일 자동생성)
migrate create -ext sql -dir ./migrations -seq test_schema
💡 쿼리문을 잘못 작성하거나 migration이 실패한 경우
version 3으로 up 시도했으나, 실패했다 → dirty=true
실패한 migration 위에 더 많은 migration을 시도하는 것을 방지하기 위해 dirty 플래그가 설정됨
down 명령어를 이용해 버전을 낮추기
error! 버전 2가 더럽혀졌기 때문에 수정 후 force 를 이용하여 버전을 지정하라
sql 파일이 적용되지 않고 version이 올라갔기 때문에 force
를 이용하여 버전 2로 강제
migrate -source file:./migrations -database "postgresql://postgres:password@localhost:5432/postgres?sslmode=disable" force 2
버전이 2로 다운되고 dirty
값은 다시 flase