2025-02-07 17:29:37

mysql  사전설정 필수

 

docker exec -it <컨테이너명> bash

mysql -u <유저명> -p

비번치고 들어가서 쿼리 준비되면

 

set global local_infile = 1;

 

SHOW VARIABLES LIKE 'local_infile';

각각 1줄씩 입력

 

 

ON 으로 값이 확인되면 DB 에서는 받을 준비가 된상태

 

이제 VScode 등으로 파이썬이 준비되면

pip install cryptography pymysql 등 자기가 필요한 라이브러리(?) 를 깔아줍니다.

 

이제 각자 만든 파이썬을 실행시키면 

 

성공!!

 

사용한 py

 

import os
import glob
import pymysql
import logging

# 로깅 설정
logging.basicConfig(
    filename='import_log_load_data_infile.log',
    level=logging.INFO,
    format='%(asctime)s:%(levelname)s:%(message)s'
)

# 환경 변수에서 MySQL 연결 정보 가져오기
username = os.getenv('MYSQL_USER', 'root')
password = os.getenv('MYSQL_PASSWORD', 'AKJ1passwd')
host = os.getenv('MYSQL_HOST', 'localhost')
port = int(os.getenv('MYSQL_PORT', '3306'))
database = os.getenv('MYSQL_DATABASE', 'flight_data')
table_name = os.getenv('MYSQL_TABLE', 'AutoIncrement')

csv_directories = [
    'D:/FlightData',
    'D:/day15to23',
    'D:/airportstring_ICN'
]

# MySQL 연결 생성
try:
    connection = pymysql.connect(
        host=host,
        user=username,
        password=password,
        database=database,
        port=port,
        local_infile=True  # LOAD DATA LOCAL INFILE 사용을 위해 설정
    )
except pymysql.MySQLError as e:
    print(f"데이터베이스 연결 오류: {e}")
    logging.error(f"데이터베이스 연결 오류: {e}")
    exit(1)

cursor = connection.cursor()

# CSV 임포트 루프
for csv_dir in csv_directories:
    file_pattern = os.path.join(csv_dir, '*.csv')
    csv_files = glob.glob(file_pattern)
    csv_files.sort()

    print(f"디렉토리 '{csv_dir}'에서 임포트할 파일 개수: {len(csv_files)}")
    logging.info(f"디렉토리 '{csv_dir}'에서 임포트할 파일 개수: {len(csv_files)}")

    for file in csv_files:
        try:
            print(f"파일 임포트 중: {file}")
            logging.info(f"파일 임포트 중: {file}")

            # Windows 경로를 UNIX 스타일로 변환
            unix_file_path = file.replace('\\', '/')

            # LOAD DATA LOCAL INFILE 명령어 작성
            sql = f"""
            LOAD DATA LOCAL INFILE '{unix_file_path}'
            INTO TABLE {table_name}
            FIELDS TERMINATED BY ','
            ENCLOSED BY '"'
            LINES TERMINATED BY '\\n'
            IGNORE 1 ROWS;
            """

            cursor.execute(sql)
            connection.commit()
            print(f"성공적으로 임포트됨: {file}")
            logging.info(f"성공적으로 임포트됨: {file}")
        except pymysql.MySQLError as e:
            print(f"MySQL 오류 발생 (파일: {file}): {e}")
            logging.error(f"MySQL 오류 발생 (파일: {file}): {e}")
            connection.rollback()
        except Exception as e:
            print(f"오류 발생 (파일: {file}): {e}")
            logging.error(f"오류 발생 (파일: {file}): {e}")

# 연결 종료
cursor.close()
connection.close()

print("모든 파일 임포트 완료!")
logging.info("모든 파일 임포트 완료!")

 

 

 

'SQL&DB' 카테고리의 다른 글

mysql 입력 이상하게 될때  (0) 2025.02.10
도커 컴포즈 정리  (0) 2025.02.10
Docker 에서 구동하는 DB 에 데이터 넣기  (0) 2025.02.07
테이블 만들고 인덱싱까지 하기  (0) 2025.02.06
Docker 에 Mysql 깔고 수정하기  (0) 2025.02.05