루이비통 요요. 약 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..