From a2b6c58560b31478637c7d44c6a19bf8190535ea Mon Sep 17 00:00:00 2001 From: KWON Date: Tue, 8 Jul 2025 14:35:00 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20=EC=A0=91=EB=91=90=EC=82=AC=EB=A5=BC=20con?= =?UTF-8?q?fig.yaml=20=EC=97=90=EC=84=9C=20=EB=B0=9B=EC=95=84=EC=99=80=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/db_schema.py | 112 +++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 31 deletions(-) diff --git a/conf/db_schema.py b/conf/db_schema.py index e8f993c..726e444 100644 --- a/conf/db_schema.py +++ b/conf/db_schema.py @@ -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='한국천문연구원 특일정보' +)