FastAPI 스터디 준비 - 4주차 alembic을 이용한 DB Migrations

kanikim·2022년 2월 16일
1

FastAPI

목록 보기
1/5

2022.02.19 Study


벌써 4주차 FastAPI, 스터디가 지인들끼리 시작한지 이렇게 시간이 지났다. 내가 주도하는 입장에서 이렇게 진행될 줄이야! 너무나도 기쁠 다름이다. 그런 의미에서 이렇게 찬찬히 스터디에서 공부할 거를 적어나가려고 한다.

일단 내가 작성한 코드를 바탕으로 스터디를 진행할 것이기에, 다음 레포지토리를 봐주시길 바란다.

https://github.com/KaniKim/FastAPI

이번 글은 스터디를 하기 전에 필요한 것들, 그리고 간단한 문서화 정리를 하려고 한다. 그러면 스타트.


시작하기 전에


Before start, you need configure .env file. First make a .env file in this folder.

먼저 시작하기 전에 .env 파일을 만들어야 한다. 다음과 같이 2022.02.19폴더에다가 .env 파일을 만들도록 하자.


cd 2022.02.19
touch .env

After you made a .env plz add this command, which fits to you postgresql.

이렇게 .env파일을 만들었으면 포스트그레큐엘에 맞는 다음 커맨드를 입력하자.


DB_URL = "postgresql://{DB_USER_ID}:{DB_USER_PASSWORD}@{DB_HOST ex) 127.0.0.1}:{DB_PORT ex) for psql default value is 5432}/{DB_NAME}"

By this, you create .env file to save your information safe. And after this study we will add lots of information at here.

이로써, 당신은 안전하게 당신의 정보를 .env 파일에 적었다. 그리고 이 스터디에서 당신은 여기다 많은 정보를 적게 될 것이다. 참고로 .gitignore에 분명하게 .env 파일을 적어놓자.


Install python package which are needed at this study


pip install alembic, psycopg2-binary, sqlalchemy

If you start this project at a first time, plz use requirements.txt to install

만약 당신이 이 FastAPI 스터디를 처음 봤다면 requirements.txt를 통해 패키지를 인스톨하길 바란다!




Using alembic


So, what is alembic?


alembic is database migration tool to help you convenience. It is based on sqlalchemy. If you want to start alembic without nothing - even if without this repo - you can start with this command.

alembic은 데이터베이스 마이그레이션 툴로 당신을 더 편하게 도와준다. sqlalchemy에 베이스를 둔 툴이다. 만약 이 레포지토리에 있는 파일을 사용하지 않고 직접 해보고 싶다면, 먼저 alembic.ini와 alembic 파일을 지운다음에 다음과 같은 커맨드를 입력하자!


alembic init myproject

Then, you can use this code to start this project and migrate to DB.

그리고 다음과 같은 코드를 env.py 코드에 넣자


from logging.config import fileConfig
from sqlalchemy import engine_from_config, pool
from alembic import context

import models
import os, sys
from dotenv import load_dotenv

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
load_dotenv(os.path.join(BASE_DIR, ".env"))
sys.path.append(BASE_DIR)

config = context.config
config.set_main_option("sqlalchemy.url", os.environ["DB_URL"])

fileConfig(config.config_file_name)

target_metadata = models.Base.metadata

알다시피 우리는 전에 .env파일을 만들었다. 거기에 모든 정보가 들어있다. 그렇기에 거기서 정보를 뽑아와야한다! 위의 코드 중에서

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
load_dotenv(os.path.join(BASE_DIR, ".env"))
sys.path.append(BASE_DIR)

위의 코드가 바로 .env의 위치를 알려주면서 .env파일의 설정들을 긁어온다! 그리고 밑에서 긁어온 .env의 설정 변수들을 할당해준다!

Finally you can migrate! Now put this command to your cli.

최종적으로 마이그레이트를 할 수 있다! 다음 커맨드를 넣어보자!

alembic revision -m "My first migrations"

By this command you can create your own basic migration file. But you need to add a some code.

위의 코드를 통해 기본적인 마이그레이션이 끝났다! 하지만 아직 더 남았다. 본격적으로 DB에 이 설정들을 반영시켜야한다. 그렇기에 다음과 같은 migrations 세팅 파이썬 코드를 넣어준다.

def upgrade()의 경우 테이블을 반영하겠다는 함수이며 def downgrade()의 경우는 테이블을 드롭하겠다는 함수이다.

def upgrade():
    op.create_table(
        "users",
        sa.Column("id", sa.Integer(), nullable=False, primary_key=True),
        sa.Column("email", sa.String(length=255), unique=True, index=True),
        sa.Column("hashed_password", sa.String(length=255)),
        sa.Column("is_active", sa, Boolean(), default=True),
    )
    op.create_table(
        "items",
        sa.Column("id", sa.Integer(), primary_key=True, index=True),
        sa.Column("title", sa.String(), index=True),
        sa.Column("description", sa.String(), index=True),
        sa.Column("owner_id", sa.Integer(), sa.ForeignKey("users.id")),
    )


def downgrade():
    op.drop_table("users")
    op.drop_table("items")

By adding this command, you can not migrate your own table. Type this command.

이로써 드디어 마이그레이트를 할 시간이 왔다, 이제 데이터베이스에 반영해보자!

alembic upgrade head


Now enter to you pgadmin4 and you can check that DB tables are created.

ALL DONE! Now you can start study with me!

한번 pgadmin4에 들어가보자, DB 테이블이 드디어 생성되었다!

그렇다면 이제부터 본격적으로 스터디를 해보자!

profile
Backend Developer

0개의 댓글