데이터베이스의 스키마를 관리할 때 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
옵션으로 영역의 이름을 주면 해당 영역의 값을 사용하므로 서버 환경에 따라 다른 데이터베이스 정보를 사용할 수 있다. 서버의 환경변수별로 하고 싶기도 한데 아직은 그 방법을 잘 모르겠다.
Comments