데이터베이스의 접두사를 config.yaml 에서 받아와 자동으로 처리하도록 수정.

This commit is contained in:
2025-07-08 14:35:00 +09:00
parent 2d64427ed8
commit a2b6c58560

View File

@ -1,64 +1,90 @@
# lib/db_schema.py
from sqlalchemy import Table, Column, Date, Float, Integer, String, Text, MetaData
import os
import yaml
from sqlalchemy import Table, Column, Date, Integer, String, Float, Text, MetaData, UniqueConstraint, DateTime
from sqlalchemy.sql import func
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
CONFIG_PATH = os.path.join(BASE_DIR, 'conf', 'config.yaml')
with open(CONFIG_PATH, 'r', encoding='utf-8') as f:
cfg = yaml.safe_load(f)
table_prefix = cfg.get('table_prefix', '')
tables = cfg.get('tables', {})
def get_full_table_name(key):
name_in_cfg = tables.get(key, '')
if name_in_cfg:
if name_in_cfg.startswith(table_prefix):
return name_in_cfg
else:
return table_prefix + name_in_cfg
else:
return table_prefix + key
metadata = MetaData()
# 날짜별 메트릭
fg_manager_static_ga4_by_date = Table(
'fg_manager_static_ga4_by_date', metadata,
def get_full_table_name(key):
# config.yaml에서 tables: 항목의 실제 테이블명 가져오기
name_in_cfg = tables.get(key, '')
if name_in_cfg:
# 이미 prefix 포함된 이름일 수 있으니 확인
if name_in_cfg.startswith(table_prefix):
return name_in_cfg
else:
return table_prefix + name_in_cfg
else:
# 기본은 prefix + key
return table_prefix + key
# 테이블 변수명은 prefix 제외한 key를 그대로 사용
ga4_by_date = Table(
get_full_table_name('ga4_by_date'), metadata,
Column('date', Date, primary_key=True),
Column('activeUsers', Integer),
Column('screenPageViews', Integer),
Column('sessions', Integer),
)
# 날짜 + 유입 소스별 세션
fg_manager_static_ga4_by_source = Table(
'fg_manager_static_ga4_by_source', metadata,
ga4_by_source = Table(
get_full_table_name('ga4_by_source'), metadata,
Column('date', Date, primary_key=True),
Column('sessionSource', String(255), primary_key=True),
Column('sessions', Integer),
)
# 날짜 + 유입 매체별 세션
fg_manager_static_ga4_by_medium = Table(
'fg_manager_static_ga4_by_medium', metadata,
ga4_by_medium = Table(
get_full_table_name('ga4_by_medium'), metadata,
Column('date', Date, primary_key=True),
Column('sessionMedium', String(255), primary_key=True),
Column('sessions', Integer),
)
# 날짜 + 장치 카테고리별 activeUsers
fg_manager_static_ga4_by_device = Table(
'fg_manager_static_ga4_by_device', metadata,
ga4_by_device = Table(
get_full_table_name('ga4_by_device'), metadata,
Column('date', Date, primary_key=True),
Column('deviceCategory', String(255), primary_key=True),
Column('activeUsers', Integer),
)
# 날짜 + 국가별 activeUsers
fg_manager_static_ga4_by_country = Table(
'fg_manager_static_ga4_by_country', metadata,
ga4_by_country = Table(
get_full_table_name('ga4_by_country'), metadata,
Column('date', Date, primary_key=True),
Column('country', String(255), primary_key=True),
Column('activeUsers', Integer),
)
# 날짜 + 도시별 activeUsers
fg_manager_static_ga4_by_city = Table(
'fg_manager_static_ga4_by_city', metadata,
ga4_by_city = Table(
get_full_table_name('ga4_by_city'), metadata,
Column('date', Date, primary_key=True),
Column('city', String(255), primary_key=True),
Column('activeUsers', Integer),
)
fg_manager_static_air = Table(
'fg_manager_static_air',
metadata,
air = Table(
get_full_table_name('air'), metadata,
Column('date', Date, primary_key=True, nullable=False),
Column('station', String(32), nullable=False), # 🔹 추가됨
Column('station', String(32), nullable=False),
Column('pm25', Float),
Column('pm10', Float),
Column('so2', Float),
@ -67,9 +93,8 @@ fg_manager_static_air = Table(
Column('o3', Float),
)
fg_manager_static_weather = Table(
'fg_manager_static_weather',
metadata,
weather = Table(
get_full_table_name('weather'), metadata,
Column('date', Date, primary_key=True, nullable=False),
Column('stnId', Integer, nullable=False),
Column('avgTa', Float),
@ -133,8 +158,8 @@ fg_manager_static_weather = Table(
Column('sumFogDur', Float),
)
fg_manager_static_ga4 = Table(
'fg_manager_static_ga4', metadata,
ga4 = Table(
get_full_table_name('ga4'), metadata,
Column('date', Date, primary_key=True),
Column('source', String(255), primary_key=True),
Column('medium', String(255), primary_key=True),
@ -146,3 +171,28 @@ fg_manager_static_ga4 = Table(
mysql_engine='InnoDB',
mysql_charset='utf8mb4'
)
pos = Table(
get_full_table_name('pos'), metadata,
Column('idx', Integer, primary_key=True, autoincrement=True),
Column('date', Date, nullable=False),
Column('ca01', String(50), nullable=False),
Column('ca02', String(50), nullable=False),
Column('ca03', String(50), nullable=False),
Column('barcode', Integer, nullable=False),
Column('name', String(100), nullable=False),
Column('qty', Integer, nullable=False),
Column('tot_amount', Integer, nullable=False),
Column('tot_discount', Integer, nullable=False),
Column('actual_amount', Integer, nullable=False),
UniqueConstraint('date', 'ca01', 'ca02', 'ca03', 'name', 'barcode', name='uniq_pos_composite')
)
holiday = Table(
get_full_table_name('holiday'), metadata,
Column('date', String(8), primary_key=True, comment='날짜 (YYYYMMDD)'),
Column('name', String(50), nullable=False, comment='휴일명'),
Column('created_at', DateTime, server_default=func.now(), comment='등록일시'),
Column('updated_at', DateTime, server_default=func.now(), onupdate=func.now(), comment='수정일시'),
comment='한국천문연구원 특일정보'
)