오래된 파일에서 규칙에 맞게 데이터를 삽입하는 일회용 코드
This commit is contained in:
87
lib/visitor_update.py
Normal file
87
lib/visitor_update.py
Normal file
@ -0,0 +1,87 @@
|
||||
# ./lib/visitor_update.py
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pandas as pd
|
||||
from datetime import datetime
|
||||
|
||||
# 프로젝트 루트 경로 추가
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
|
||||
from conf.db import get_session
|
||||
from conf.db_schema import pos
|
||||
from sqlalchemy import select
|
||||
|
||||
# 상수 정의
|
||||
FILE_PATH = os.path.join(os.path.dirname(__file__), '..', 'data', 'visitor_raw.xlsx')
|
||||
CA01 = '매표소'
|
||||
CA02 = 'POS'
|
||||
CA03 = '입장료'
|
||||
BARCODE = 11111111
|
||||
DEFAULT_INT = 0
|
||||
|
||||
|
||||
def load_excel(filepath):
|
||||
df = pd.read_excel(filepath)
|
||||
df.columns = ['date', 'qty']
|
||||
df['date'] = pd.to_datetime(df['date']).dt.date
|
||||
return df
|
||||
|
||||
|
||||
def get_existing_dates(session, dates):
|
||||
"""DB에 이미 존재하는 날짜 목록 조회"""
|
||||
stmt = select(pos.c.date).where(pos.c.date.in_(dates))
|
||||
result = session.execute(stmt).scalars().all()
|
||||
return set(result)
|
||||
|
||||
|
||||
def insert_data(df):
|
||||
session = get_session()
|
||||
try:
|
||||
all_dates = set(df['date'].unique())
|
||||
existing_dates = get_existing_dates(session, all_dates)
|
||||
|
||||
# 중복 날짜 제거
|
||||
if existing_dates:
|
||||
print(f"[INFO] 이미 존재하는 날짜는 건너뜁니다: {sorted(existing_dates)}")
|
||||
df = df[~df['date'].isin(existing_dates)]
|
||||
|
||||
if df.empty:
|
||||
print("[INFO] 삽입할 신규 데이터가 없습니다.")
|
||||
return
|
||||
|
||||
for _, row in df.iterrows():
|
||||
record = {
|
||||
'date': row['date'],
|
||||
'ca01': CA01,
|
||||
'ca02': CA02,
|
||||
'ca03': CA03,
|
||||
'barcode': BARCODE,
|
||||
'name': '입장객',
|
||||
'qty': int(row['qty']),
|
||||
'tot_amount': DEFAULT_INT,
|
||||
'tot_discount': DEFAULT_INT,
|
||||
'actual_amount': DEFAULT_INT
|
||||
}
|
||||
session.execute(pos.insert().values(**record))
|
||||
|
||||
session.commit()
|
||||
print(f"[INFO] {len(df)}건의 데이터가 성공적으로 삽입되었습니다.")
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"[ERROR] 데이터 저장 중 오류 발생: {e}")
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
def main():
|
||||
if not os.path.exists(FILE_PATH):
|
||||
print(f"[ERROR] 파일을 찾을 수 없습니다: {FILE_PATH}")
|
||||
return
|
||||
|
||||
df = load_excel(FILE_PATH)
|
||||
insert_data(df)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user