
루이비통 요요. 약 30만원.
마이그레이션.. 언제나 짜릿하고 매우 자주 스트레스를 받는다. 오늘은 그 이름도 귀여운 요요마이그레이션에 대해 공부해본다.
간단한 마이그레이션 파일을 생성해 MYySQL 데이터베이스에 테이블을 만들어보자.
요요(Yoyo)는 데이터베이스 스키마를 마이그레이션 해주는 도구이다.
Migration파일 내부에는 데이터베이스에 테이블을 만들기 위한 마이그레이션 코드 (SQL or 파이썬) 가 단계별로 작성되어 있다. 예를 들어, 아래 사진과 같이.

(오늘의 여담, 나는 처음 보는 코드에 무한히 낯을 가린다. 후... 친해지기 힘들어... 낯선 코드...)
conda activate flask-graphql-bobful << 설치 전에 언제나 잊지 말자 가상환경 !!
pip install yoyo-migrations
끝!
테이블 하나 당 migration 파일을 하나 만들기로 한다.
오늘은 두가지 파일을 만들어 볼 것이다.
user_status테이블 생성 스키마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("")
]
user_status 테이블이기 때문에 id, status, 생성 날짜만 기입하도록 한다. 사용될 데이터로는 우선 샘플로 PENDING과 SIGNED_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 정.복.
지금 코드 간격 다 맞출까 말까 고민중인데... 일단 흐린 눈으로 둬본다 🧐
mysql에 db 만들어져있는지 먼저 확인하기 !
마이그레이션 하는 방법엔 크게 두가지가 있는데, 커맨드라인에서 바로 실행시키는 방법
yoyo apply --database mysql://scott:tiger@localhost/db .
근데 이렇게 할 일 아마 없을 것이다. 아까 만든 yoyo.ini에
database 라는 변수에 mysql://scott:tiger@localhost/db 를 지정해두고
yoyo apply
하면 테이블이 순서대로 쭈루룩 생긴다.
마이그레이션 전 후 를 비교해보면,
yoyo list


status가 달라진 것을 알 수 있다.
이제 열심히 다른 테이블도 만들어보자 !
마이그레이션에 대한 스트레스가 1MGR 줄었다고 하겠다. 미래의 나야, 내가 이 블로그 써둬서 행복하지?
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는 고유 로고 없습니까..? 🪀 노렸을 법도 한데..? 🪀🪀🪀🪀
갖고싶네yo yoyo..