SQLAlchemy, Alembic 사용 시 alembic.ini 외부에 연결 문자열 저장하기
Alembic은 SQLAlchemy 기반 데이터베이스 마이그레이션을 위한 Python 라이브러리입니다. 일반적으로 alembic.ini 파일에 연결 문자열을 저장하지만, 보안 및 구성 관리 측면에서 이를 권장하지 않는 경우가 있습니다. 이 글에서는 alembic.ini 외부에 연결 문자열을 저장하는 방법에 대해 한국어로 설명합니다.
방법
다음은 alembic.ini 외부에 연결 문자열을 저장하는 두 가지 일반적인 방법입니다.
환경 변수 사용
환경 변수를 사용하여 연결 문자열을 저장하는 것은 가장 간단하고 안전한 방법 중 하나입니다. 다음 단계를 따르십시오.
DATABASE_URL
이라는 환경 변수를 만들고, 이에 연결 문자열을 할당합니다. 예를 들어, 다음과 같이 bash 쉘에서 실행할 수 있습니다.
export DATABASE_URL="postgresql://user:password@host:port/database"
- Alembic 설정에서
url
매개 변수 대신DATABASE_URL
환경 변수를 참조하도록 합니다. 예를 들어,alembic.ini
파일에 다음과 같이 추가합니다.
[alembic]
url = ${DATABASE_URL}
- Alembic 명령을 실행할 때 환경 변수를 설정해야 합니다. 예를 들어, 다음과 같이
alembic upgrade head
명령을 실행할 수 있습니다.
alembic upgrade head
Python 모듈 사용
Python 모듈을 사용하여 연결 문자열을 저장하는 방법은 환경 변수를 사용하는 것보다 더 유연하지만, 코드 관리 측면에서 더 복잡할 수 있습니다. 다음 단계를 따르십시오.
- 연결 문자열을 저장하는 Python 모듈을 만듭니다. 예를 들어,
db_config.py
라는 이름의 모듈을 만들고 다음과 같은 코드를 추가합니다.
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
Base = declarative_base()
def get_engine():
return create_engine("postgresql://user:password@host:port/database")
[alembic]
url = db_config:get_engine
PYTHONPATH=path/to/db_config alembic upgrade head
주의 사항
- alembic.ini 외부에 연결 문자열을 저장하는 경우, 해당 정보가 안전하게 보호되도록 해야 합니다.
- 환경 변수를 사용하는 경우, 해당 변수가 모든 Alembic 명령을 실행할 때 설정되어 있는지 확인해야 합니다.
- Python 모듈을 사용하는 경우, 해당 모듈이 Alembic 명령을 실행할 때 사용할 수 있는 위치에 있는지 확인해야 합니다.
예제 코드
# db_config.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
Base = declarative_base()
def get_engine():
return create_engine("postgresql://user:password@host:port/database")
# main.py
from alembic import command
from db_config import get_engine
engine = get_engine()
command.upgrade(engine)
# alembic.ini
[alembic]
url = db_config:get_engine
# db_config.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
Base = declarative_base()
def get_engine():
return create_engine("postgresql://user:password@host:port/database")
- 위 예제 코드는 PostgreSQL 데이터베이스를 사용하는 경우를 기준으로 합니다. 다른 데이터베이스를 사용하는 경우, 연결 문자열 형식을 변경해야 합니다.
user
,password
,host
,port
,database
는 실제 데이터베이스 정보로 변경해야 합니다.
- SQLAlchemy 및 Alembic 사용에 대한 자세한 내용은 각각의 문서를 참조하십시오.
- 다른 방법으로 alembic.ini 외부에 연결 문자열을 저장하는 방법도 있지만, 위에서 설명한 두 가지 방법은 가장 일반적이고 안전한 방법입니다.
SQLAlchemy, Alembic 사용 시 alembic.ini 외부에 연결 문자열 저장하기: 대체 방법
app.config 사용 (Flask 프레임워크)
Flask 프레임워크를 사용하는 경우, app.config
객체를 사용하여 연결 문자열을 저장할 수 있습니다. 다음 단계를 따르십시오.
- Flask 애플리케이션에서
app.config
에 연결 문자열을 설정합니다. 예를 들어, 다음과 같이config.py
파일에 추가합니다.
from flask import Flask
from sqlalchemy import create_engine
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://user:password@host:port/database"
[alembic]
url = app:config['SQLALCHEMY_DATABASE_URI']
os.environ 사용
os.environ
객체를 사용하여 환경 변수에 접근할 수도 있습니다. 다음 단계를 따르십시오.
export DATABASE_URL="postgresql://user:password@host:port/database"
[alembic]
url = os.environ['DATABASE_URL']
urlparse 모듈 사용
urlparse
모듈을 사용하여 연결 문자열을 파싱하고 개별 구성 요소를 저장할 수 있습니다. 다음 단계를 따르십시오.
from urllib.parse import urlparse
def parse_db_url(url):
parsed = urlparse(url)
return {
'user': parsed.username,
'password': parsed.password,
'host': parsed.hostname,
'port': parsed.port,
'database': parsed.path[1:]
}
def get_engine(url):
config = parse_db_url(url)
return create_engine(f"postgresql://{config['user']}{':'+config['password'] if config['password'] else ''}@{config['host']}{':'+str(config['port']) if config['port'] else ''}/{config['database']}")
[alembic]
url = db_url:get_engine
기타 방법
위에서 언급한 방법 외에도 다음과 같은 방법으로 alembic.ini 외부에 연결 문자열을 저장할 수 있습니다.
- Vault 또는 HashiCorp Consul과 같은 비밀 관리 도구 사용
- Docker 환경 변수 사용
- Kubernetes ConfigMap 또는 Secret 사용
- 어떤 방법을 사용하든, 연결 문자열이 안전하게 보호되도록 해야 합니다.
- 사용하는 방법에 따라 추가적인 설정 또는 코드가 필요할 수 있습니다.
- 각 방법의 장단점을 고려하여 프로젝트에 가장 적합한 방법을 선택해야 합니다.
- Flask 문서:
python sqlalchemy alembic