alembic 으로 플러그인들 데이터베이스 관리 정보
alembic 으로 플러그인들 데이터베이스 관리본문
안녕하세요.
g5도 여러가지로 잘쓰다가 g6 제가 좋아하는 언어로 작업이 된걸 보고 잠깐 보다가
데이터베이스 마이그레이션 기능이 없는듯 하여 찾다 보니 alembic 란게 있더군요
데이터 베이스와 models 를 비교 해서 데이터 베이스를 관리하기 편합니다.
g6의 기본 테이블 들과 약간의 문제로 연동이 어려울수 있는데 어제 쫌 고민 하다 방법을 찾아
공유 하고자 글을 쓰네요 더좋은 방법도 있으시면 말 해주세요. 잠깐 본거라 어설프니 양해 바랍니다.
1. requirements.txt 마지막줄에 alembic==1.13.2 추가 후 pip 재인스톨
2. alembic.ini # sqlalchemy.url = driver://user:pass@localhost/dbname 주석 처리
3. alembic/env.py
import os
from dotenv import load_dotenv
load_dotenv()
config.set_main_option(
"sqlalchemy.url",
"mysql+pymysql://{username}:{password}@{host}:{port}/{db_name}".format(
username=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD'),
host=os.getenv('DB_HOST'),
port=os.getenv('DB_PORT'),
db_name=os.getenv('DB_NAME')
)
)
from core.models import Base
import os
import sys
from sqlalchemy import MetaData
import os, sys
import importlib
# 현재 폴더의 위치를 가져옵니다.
current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# plugins 폴더 내의 모든 models 폴더를 찾습니다.
plugins_dir = os.path.join(current_dir, 'plugin')
from core.models import Base
for root, dirs, files in os.walk(plugins_dir):
if "models.py" in files:
# models.py 파일의 경로를 만듭니다.
models_path = os.path.join(root, "models.py")
# 폴더 이름을 가져옵니다.
folder_name = os.path.basename(root)
# 동적으로 models.py 파일을 import 합니다.
spec = importlib.util.spec_from_file_location(folder_name, models_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# 폴더 이름을 합쳐서 Base를 새로운 이름으로 가져옵니다.
if hasattr(module, 'Base'):
new_name = f"{folder_name}Base"
# `globals()`에 `new_name`을 키로 하고, `Base` 클래스를 값으로 저장합니다.
globals()[new_name] = getattr(module, 'Base')
target_metadata = Base.metadata
# 문제가 되던 기존 g6 기본 또는 자동 g6 models에 존재 안하는 테이블들 떄문에 동기화 무시 입니다. 다른 것들도 추가 할수 있습니다.
def include_object(object, name, type_, reflected, compare_to):
if type_ == 'table' and name.startswith('g6_'):
return False
return True
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
include_object=include_object, # 이거 추가
)
context.configure(
connection=connection, target_metadata=target_metadata,
include_object=include_object, #이거 추가
)
플러그인 core.database 가 경로 문제 때문에 아래를 models 에 추가 합니다.
import os
import sys
# 현재 폴더의 위치를 가져옵니다.
current_dir = os.path.dirname(os.path.abspath(__file__))
# 현재 폴더의 위치의 parent 위치를 가져옵니다.
parent_dir = os.path.dirname(current_dir)
# parent 위치의 parent 위치를 가져옵니다.
grandparent_dir = os.path.dirname(parent_dir)
# grandparent 위치의 models를 sys.path에 추가합니다.
sys.path.insert(0, grandparent_dir)
from core.settings import settings
from core.models import Base
DB_TABLE_PREFIX = "hanni_shop_"
G6_DB_TABLE_PREFIX = settings.DB_TABLE_PREFIX
이렇게 하면 플러그인의 테이블들을 쉽게 관리 할수 있습니다.
팁 아닌 팁이네요 수고들 하시고 맛프 하세요
0
댓글 0개