Yoyo database migrations

Soheon Lee·2020년 7월 12일
8
post-thumbnail

루이비통 요요. 약 30만원.

소개

마이그레이션.. 언제나 짜릿하고 매우 자주 스트레스를 받는다. 오늘은 그 이름도 귀여운 요요마이그레이션에 대해 공부해본다.
간단한 마이그레이션 파일을 생성해 MYySQL 데이터베이스에 테이블을 만들어보자.

요요(Yoyo)는 데이터베이스 스키마를 마이그레이션 해주는 도구이다.

Migration파일 내부에는 데이터베이스에 테이블을 만들기 위한 마이그레이션 코드 (SQL or 파이썬) 가 단계별로 작성되어 있다. 예를 들어, 아래 사진과 같이.

(오늘의 여담, 나는 처음 보는 코드에 무한히 낯을 가린다. 후... 친해지기 힘들어... 낯선 코드...)

설치

conda activate flask-graphql-bobful << 설치 전에 언제나 잊지 말자 가상환경 !!

pip install yoyo-migrations

끝!

자, 이제 시작

테이블 하나 당 migration 파일을 하나 만들기로 한다.

1. 새로운 마이그레이션 파일 생성

오늘은 두가지 파일을 만들어 볼 것이다.

  1. user_status 테이블 생성 스키마
  2. users 테이블 생성 스키마

파일 사이에 의존성이 있기 때문에 아무 파일에도 의존하지 않는 파일 먼저 생성해야한다. 예를 들어 foreign_key 라든가 foreign_key 라든가 foreign_key 같은...

user데이터를 한 줄 생성하기 위해서는 user_status가 먼저 만들어져 있어야 하므로, 1번 파일을 먼저 만든다.

yoyo new . -m "Create user_status table"

명령어를 실행하면 자동으로 요요 마이그레이션 파일이 생성되고, 내부에 이런 코드가 있다.

"""
Create user_status table
"""

from yoyo import step
__depends__ = {}

steps = [
	step("")
]

2. 마이그레이션 파일 작성

user_status 테이블이기 때문에 id, status, 생성 날짜만 기입하도록 한다. 사용될 데이터로는 우선 샘플로 PENDINGSIGNED_UP 상태만 추가해두기로 한다.

"""
Create user_status table
"""

from yoyo import step

__depends__ = {} <------- 그 어떤 파일에도 의존하지 않는 마이그레이션!

steps = [
    step("""
         CREATE TABLE user_status (
            id INT NOT NULL AUTO_INCREMENT,
            status VARCHAR(50) NOT NULL,
            created_at TIMESTAMP NOT NULL DEFAULT NOW(),
            primary key(id)
        );
    """, ignore_errors='apply'),
    step("""
         INSERT INTO user_status (id, status)
         VALUES (1, "PENDING"), (2, "SIGNED_UP")
    """, ignore_errors='apply')
]

저장하고 나가면 터미널에 아래와 같은 질문이 뜬다.

주저 없이 yes!
yoyo.ini 라는 이름의 configuration파일이 생성된다.

생성된 마이그레이션 파일 이름(20200712_01_oUtFx-create-user-status-table.py)이 마음에 들지 않기 때문에 (01_create_user_status_table.py)로 바꿔준다.
이제, student_status 테이블에 의존하고 있는 student 테이블을 만들어보자.
다시 한 번

yoyo new . -m "Create user table"


__depends__에 자동으로 직전 파일이 입력되었다. 지금 만들고 있는 테이블은 사용자 정보를 저장할 것이다. 사용자를 저장할 때는 이 사용자가 '가입 진행 중'인지 '가입 완료'인지 지정해주어야 하므로, 이 상태를 정규화한 user_status 테이블이 먼저 있어야만 한다. 따라서 depends에 파일을 지정한 채로 바로 사용한다. 필요 없으면 지우면 된다. 나는 필요하니까 쓴다.

후... 힘들었다 MySQL 정.복.
지금 코드 간격 다 맞출까 말까 고민중인데... 일단 흐린 눈으로 둬본다 🧐

3. MySQL을 대상으로 yoyo migration 실행

mysql에 db 만들어져있는지 먼저 확인하기 !

마이그레이션 하는 방법엔 크게 두가지가 있는데, 커맨드라인에서 바로 실행시키는 방법

yoyo apply --database mysql://scott:tiger@localhost/db .

근데 이렇게 할 일 아마 없을 것이다. 아까 만든 yoyo.ini에
database 라는 변수에 mysql://scott:tiger@localhost/db 를 지정해두고

yoyo apply

하면 테이블이 순서대로 쭈루룩 생긴다.
마이그레이션 전 후 를 비교해보면,

yoyo list


status가 달라진 것을 알 수 있다.

이제 열심히 다른 테이블도 만들어보자 !
마이그레이션에 대한 스트레스가 1MGR 줄었다고 하겠다. 미래의 나야, 내가 이 블로그 써둬서 행복하지?

Configuration 파일 숨기기

yoyo.ini파일에 심어둔 내 데이터베이스 설정을 숨기고 싶을 수 있다. 내 username도 있고, 비밀 번호도 있으니. 다른 파일(yoyo-local.ini)에 선언해두고, 불러와서 쓰고 싶다.

# yoyo-local.ini
[DEFAULT]
database = mysql://scott:tiger@localhost/db

이렇게 선언해두고 yoyo.ini 파일에서 불러와서 쓰면 되는데, 두가지 방법이 있다.

# yoyo.ini 파일

%inherit = yoyo-local.ini
%include = yoyo-local.ini

inherit : inherit 파일 설정들이 현재 파일 설정보다 먼저 실행되어, 현재 파일에서 같은 변수를 설정하면 덮어씌워짐.
include : include 파일 설정들이 현재 파일 설정보다 더 나중에 실행되기에, 현재 파일에서 선언한 설정들을 모두 덮어씀.

데이터베이스는 따로 현재 ini 파일에서 추가적으로 설정하지 않을 것이기 때문에 어느 것을 사용해도 상관 없지만, 나는 include를 사용했다.

의문

아니, yoyo는 고유 로고 없습니까..? 🪀 노렸을 법도 한데..? 🪀🪀🪀🪀

profile
Hello, World

4개의 댓글

comment-user-thumbnail
2020년 7월 20일

갖고싶네yo yoyo..

답글 달기
comment-user-thumbnail
2021년 2월 8일

잘 읽었어yo

답글 달기
comment-user-thumbnail
2021년 4월 1일

정말 유용한 정보 감사합니다~
앞으로도 세상을 변화시키는 좋은 개발자로 성장하시기를 옆자리에서 보고 있겠습니다!

답글 달기
comment-user-thumbnail
2021년 5월 13일

깔끔하게 정리해 주셔서 잘 읽었습니다!

답글 달기