[SI]프로젝트 5주차

소복치·2024년 8월 4일

이번주에는 데이터 요구사항 정의서를 보고 우리가 각자 맡은 테이블을 생성하였다.

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()

파일에 있는 데이터는 일단 헤더가 없고, 구분자가 "," 가 아닌 "^" 문자로 하기로 했다.
그래서 내가 짠 로직은 이렇다.

  1. 파일의 인코딩 처리를 해준다. (구분자는 "^" 로 지정)
  2. 읽어온 데이터프레임에 실제 사용할 컬럼명을 지정한다.
  3. jaydebeapi를 이용하여 Tibero DB에 연결한다.
  4. A테이블의 기존 데이터를 삭제하여 새로운 데이터로 갱신한다.
  5. 기본테이블에서 직원번호와 직원번호2를 조회한 후, 데이터프레임으로 변환한뒤, 직원번호를 기준으로 읽어온 데이터에 직원번호2를 매핑한다.
  6. 직원번호 또는 직원번호2에 NULL 값이 있는지 확인하고, NULL 값이 존재하면 오류를 발생시킨다.
  7. A테이블에 데이터프레임의 데이터를 삽입 후 컬럼명과 값의 개수에 맞춰 동적으로 쿼리를 생성한다.
  8. 모든 작업이 완료된 후 트랜잭션을 커밋하고 데이터베이스 연결을 종료한다.
profile
오늘 터져도내일 다시극복

0개의 댓글