728x90
오라클에서 테이블의 SELECT 결과를 그대로 INSERT문으로 변환해주는 Python 코드를 작성해드릴게요. 이 코드는 poe-api-wrapper와는 별개로, 오라클 데이터베이스에 접속해서 데이터를 읽고 INSERT문을 생성하는 예제입니다. 오라클 접속을 위해 cx_Oracle 라이브러리를 사용하며, 아래는 구체적인 사례와 함께 작성된 코드입니다.
요구사항
-
입력: 오라클 테이블에서 SELECT한 결과.
-
출력: 해당 결과를 기반으로 한 INSERT INTO SQL 문.
-
상황 예시: employees 테이블에서 데이터를 읽고, 그 데이터를 그대로 employees_backup 테이블에 넣는 INSERT문을 생성.
사전 준비
-
Python 패키지 설치:bash
pip install cx_Oracle
코드
python
import cx_Oracle
# 오라클 DB 접속 정보
username = "your_username" # 오라클 사용자 이름
password = "your_password" # 오라클 비밀번호
dsn = "localhost:1521/your_service_name" # 예: localhost:1521/ORCL
# 테이블 이름 설정
source_table = "employees" # 원본 테이블
target_table = "employees_backup" # 데이터를 넣을 테이블
try:
# 오라클 DB에 연결
connection = cx_Oracle.connect(username, password, dsn)
cursor = connection.cursor()
# 원본 테이블에서 데이터 조회
query = f"SELECT * FROM {source_table}"
cursor.execute(query)
# 컬럼 이름 가져오기
columns = [desc[0] for desc in cursor.description]
column_list = ", ".join(columns)
# 데이터 행을 읽고 INSERT 문 생성
insert_statements = []
for row in cursor:
# 각 값을 문자열로 변환하고, 문자열이면 따옴표로 감쌈
values = []
for val in row:
if val is None:
values.append("NULL")
elif isinstance(val, str):
values.append(f"'{val.replace('\'', '\'\'')}'") # 작은따옴표 이스케이프 처리
else:
values.append(str(val))
value_list = ", ".join(values)
insert_sql = f"INSERT INTO {target_table} ({column_list}) VALUES ({value_list});"
insert_statements.append(insert_sql)
# 생성된 INSERT 문 출력
for statement in insert_statements:
print(statement)
except cx_Oracle.DatabaseError as e:
print(f"오라클 오류 발생: {e}")
finally:
# 연결 종료
if 'cursor' in locals():
cursor.close()
if 'connection' in locals():
connection.close()
코드 설명
-
DB 연결:
-
cx_Oracle.connect: 사용자 이름, 비밀번호, 데이터베이스 서비스 이름으로 오라클에 연결.
-
예: dsn = "localhost:1521/ORCL"은 로컬 오라클 서버의 기본 포트와 서비스 이름입니다.
-
-
데이터 조회:
-
SELECT * FROM employees: employees 테이블의 모든 데이터를 가져옴.
-
cursor.description: 테이블의 컬럼 이름을 추출.
-
-
INSERT 문 생성:
-
각 행의 데이터를 읽고, 값에 따라 처리:
-
NULL이면 "NULL"로.
-
문자열이면 작은따옴표로 감싸고, 내부 작은따옴표는 이스케이프 처리(' -> '').
-
숫자 등은 그대로 문자열로 변환.
-
-
예: INSERT INTO employees_backup (emp_id, name, salary) VALUES (1, '홍길동', 5000);
-
-
예외 처리:
-
연결 오류나 쿼리 오류가 발생하면 메시지를 출력.
-
작업 후 연결을 안전하게 종료.
-
728x90
실행 예시
가정
-
employees 테이블:
EMP_ID NAME SALARY 1 홍길동 5000 2 김영희 6000
출력 결과
INSERT INTO employees_backup (EMP_ID, NAME, SALARY) VALUES (1, '홍길동', 5000);
INSERT INTO employees_backup (EMP_ID, NAME, SALARY) VALUES (2, '김영희', 6000);
사용 방법
-
접속 정보 수정:
-
username, password, dsn을 자신의 오라클 환경에 맞게 변경하세요.
-
예: dsn = "192.168.1.100:1521/mydb"
-
-
테이블 이름 변경:
-
source_table과 target_table을 원하는 테이블 이름으로 수정.
-
-
실행:
-
Python 파일로 저장 후 실행하거나, Python 콘솔에서 바로 실행.
-
추가 팁
-
파일로 저장하고 싶을 때:python
with open("insert_statements.sql", "w", encoding="utf-8") as f: for statement in insert_statements: f.write(statement + "\n")
이 코드를 추가하면 insert_statements.sql 파일에 결과가 저장됩니다. -
특정 컬럼만 선택: SELECT * 대신 SELECT emp_id, name FROM employees처럼 원하는 컬럼만 조회할 수도 있어요. 그러면 INSERT도 해당 컬럼만 포함됩니다.
이 코드는 오라클에서 SELECT 결과를 INSERT문으로 바꿔주는 간단하면서도 실용적인 도구입니다. 더 궁금한 점이나 수정할 부분이 있으면 말씀해주세요!
728x90
'Python을 배워보자' 카테고리의 다른 글
Python으로 오라클 필드명과 카멜 케이스 변수 매핑 자동화하기 (0) | 2025.04.19 |
---|---|
ㅎㅎ (1) | 2025.03.06 |
Poe.com 에서 AI 챗봇을 Python으로 불러서 써보자 (0) | 2025.03.03 |
Python으로 텔레그램 봇 만들기: 초보자를 위한 상세 가이드 (0) | 2025.03.02 |
TypeScript 파일 파싱하기: Node.js와 Python 연동으로 const 객체를 Python 딕셔너리로 변환하기 (0) | 2025.03.02 |