Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Alembic으로 환경별 다른 데이터베이스 사용하기

데이터베이스의 스키마를 관리할 때 Alembic사용하고 있다.

[alembic]
script_location = alembic
sqlalchemy.url = postgresql://user:password@host/db_name

Alembic에서는 데이터베이스 접속 정보를 alembic.ini에서 다음과 관리하고 있는데 [alembic]이라고 된 영역이 기본 설정이고 여기서 sqlalchemy.url에 데이터베이스 접속 정보를 보관하고 있다. 하지만 개발을 하면 로컬 데이터베이스도 있고 테스트나 스테이지 용 데이터베이스도 있고 실제 서비스를 하는 데이터베이스가 있는데 각 데이터베이스에서 스키마를 관리해 주어야 하므로 상황별로 다른 데이터베이스 접속 정보를 사용해야 한다.

sqlalchemy.url - A URL to connect to the database via SQLAlchemy. This key is in fact only referenced within the env.py file that is specific to the “generic” configuration; a file that can be customized by the developer. A multiple database configuration may respond to multiple keys here, or may reference other sections of the file.

문서에 따르면 sqlalchemy.url는 SQLAlchemy가 사용하는 데이터베이스 접속 URL이고 env.py파일에서만 사용하고 있다는 것이다. 이 값이나 env.py파일에서 이 값을 커스터마이징할 수 있는 것 같은데 SQLAlchemy를 안 쓰다 보니 정확한 방법을 알기가 어려웠고 대부분은 Python과 함께 쓰고 있으므로 애플리케이션에서 사용하는 데이터베이스 정보를 읽어와서 Alembic에서 사용하는 것으로 보였다. 나는 Alembic만 별도로 쓰고 있었으므로 이 방법을 적용하기가 어려웠고 SQLAlchemy도 전혀 몰라서 적용하기가 어려웠다.

여러 가지 시도 끝에 다음과 같이 영역을 여러 가지 만들어서 필요에 따라 다른 설정을 사용하도록 할 수 있다는 걸 알게 되었다.

[alembic]
script_location = alembic
sqlalchemy.url = postgresql://user:password@host/db_name

[db_test]
script_location = alembic
sqlalchemy.url = postgresql://user:password@test_host/test_db_name

[db_stage]
script_location = alembic
sqlalchemy.url = postgresql://user:password@stage_host/stage_db_name

[db_production]
script_location = alembic
sqlalchemy.url = postgresql://user:password@production_host/production_db_name

스키마를 적용할 때 alembic upgrade head을 실행하면 [alembic]영역의 설정을 사용하지만 alembic --name db_test upgrade head처럼 --name 옵션으로 영역의 이름을 주면 해당 영역의 값을 사용하므로 서버 환경에 따라 다른 데이터베이스 정보를 사용할 수 있다. 서버의 환경변수별로 하고 싶기도 한데 아직은 그 방법을 잘 모르겠다.

2015/05/23 18:06 2015/05/23 18:06