이번주에는 데이터 요구사항 정의서를 보고 우리가 각자 맡은 테이블을 생성하였다.
DB는 Tibero를 사용했으며 언어는 이전 글과 같이 Python을 사용한다.
밑에 처음으로 작성한 예시 코드 이다.
import pandas as pd
import chardet
import jaydebeapi
# 파일 인코딩 감지
file_path = 'path_to_your_file.dat'
with open(file_path, 'rb') as f:
result = chardet.detect(f.read())
encoding = result['encoding']
print(f"Detected encoding: {encoding}")
# .dat 파일 읽기 (감지된 인코딩 사용, 헤더 없음, 구분자는 ^)
df = pd.read_csv(file_path, delimiter='^', encoding=encoding, header=None)
# 데이터 파일의 실제 컬럼명 지정
df.columns = [
'직원번호'
, '기타_컬럼1'
, '기타_컬럼2'
, '기타_컬럼3'
]
# Tibero DB 연결 설정
import jaydebeapi
connection = jaydebeapi.connect('com.tmax.tibero.jdbc.TbDriver',
'jdbc:tibero:thin:@host:port:service_name',
['your_username', 'your_password'], 'path_to_tibero_jdbc_jar/tibero7-jdbc.jar')
cursor = connection.cursor()
# A테이블의 기존 데이터 삭제
delete_query = "DELETE FROM A테이블"
cursor.execute(delete_query)
connection.commit()
# 기본 테이블의 데이터 조회
query_basic = "SELECT 직원번호, 직원번호2 FROM 기본테이블"
cursor.execute(query_basic)
basic_table_data = cursor.fetchall()
# DataFrame으로 변환
basic_df = pd.DataFrame(basic_table_data, columns=['직원번호', '직원번호2'])
# 직원번호 열의 데이터 타입을 문자열로 변환
df['직원번호'] = df['직원번호'].astype(str)
basic_df['직원번호'] = basic_df['직원번호'].astype(str)
# 직원번호를 기준으로 매핑하여 직원번호2 추가
df = df.merge(basic_df, on='직원번호', how='left')
# 기본 키 값 확인
if df['직원번호'].isnull().any() or df['직원번호2'].isnull().any():
raise ValueError("PK(직원번호, 직원번호2)에 NULL 값이 포함되어 있습니다. 기본 키 값을 확인하십시오.")
# A 테이블에 데이터 삽입 (기타 컬럼 추가)
columns = df.columns.tolist() # DataFrame의 모든 컬럼명을 가져옴
columns_str = ', '.join(columns)
values_placeholders = ', '.join(['?'] * len(columns))
insert_query = f"""
INSERT INTO A테이블 ({columns_str})
VALUES ({values_placeholders})
"""
for index, row in df.iterrows():
cursor.execute(insert_query, tuple(row))
# 커밋 및 연결 종료
connection.commit()
cursor.close()
connection.close()
파일에 있는 데이터는 일단 헤더가 없고, 구분자가 "," 가 아닌 "^" 문자로 하기로 했다.
그래서 내가 짠 로직은 이렇다.