[Python] 데이터베이스(ORACLE)
programming/python

[Python] 데이터베이스(ORACLE)

15. 데이터베이스(ORACLE)

 

15.1 오라클 테이블

DROP TABLE Product CASCADE CONSTRAINTS;

-- CLOB: 최대 4G 입력 가능, 한 테이블에서 여러 컬럼에 사용 가능, 검색 가능
-- LONG: 최대 2G 입력 가능, 한 테이블에서 1개 컬럼만 사용 가능, 검색이 안 됨
CREATE TABLE Product (
    product_id      NUMBER,                     -- 상품 코드
    product_name    VARCHAR2(50),               -- 상품 이름
    price           NUMBER          DEFAULT 0,  -- 단가
    description     CLOB,                       -- 상품 설명
    picture_url     VARCHAR2(500),              -- 상품 이미지 파일 이름
    PRIMARY KEY(product_id)
);

-- SELECT * FROM Product WHERE description LIKE '%샘플%';

INSERT INTO Product VALUES (1, '레몬', '1500', '레몬에 포함된 구연산은 피로 회복에 좋습니다. 비타민 C도 풍부합니다.', 'lemon.jpg');
INSERT INTO Product VALUES (2, '오렌지', '2000', '비타민 C가 풍부합니다. 생과일주스로 마시면 좋습니다.', 'orange.jpg');
INSERT INTO Product VALUES (3, '키위', '3000', '비타민 C가 매우 풍부합니다. 다이어트나 미용에 좋습니다.', 'kiwi.jpg');
INSERT INTO Product VALUES (4, '포도', '5000', '폴리페놀을 다량 함유하고 있어 항산화 작용을 합니다.', 'grape.jpg');
INSERT INTO Product VALUES (5, '딸기', '8000', '비타민 C나 플라보노이드를 다량 함유하고 있습니다.', 'strawberry.jpg');
INSERT INTO Product VALUES (6, '귤', '7000', '시네프린을 함유하고 있어 감기 예방에 좋다고 합니다.', 'tangerine.jpg');

SELECT * FROM Product;
COMMIT;

-- 상품 코드를 위한 시퀸스 생성
DROP SEQUENCE seq_product;
CREATE SEQUENCE seq_product
START WITH 10
INCREMENT BY 1;

INSERT INTO Product VALUES (seq_product.NEXTVAL, '사과', 1500, '맛있는 사과예요.', 'apple.jpg');

SELECT * FROM Product;
COMMIT;

 

 

15.2 파이썬 코드

cx_Oracle 설치

# pip install cx_Oracle
import cx_Oracle

 

오라클 연결

conn = cx_Oracle.connect("java/java1234@localhost:1521/orcl")
cursor = conn.cursor()

# 전체 레코드 삭제
sql = "DELETE FROM Product"
cursor.execute(sql)

 

레코드 추가

# 레코드 추가
items = [
    (1, '레몬', 1500, \
        '레몬에 포함된 구연산은 피로 회복에 좋습니다. 비타민 C도 풍부합니다.', 'lemon.jpg'),
    (2, '오렌지', 2000, \
        '비타민 C가 풍부합니다. 생과일주스로 마시면 좋습니다.', 'orange.jpg'),
    (3, '키위', 3000, \
        '비타민 C가 매우 풍부합니다. 다이어트나 미용에 좋습니다.', 'kiwi.jpg'),
    (4, '포도', 5000, \
        '폴리페놀을 다량 함유하고 있어 항산화 작용을 합니다.', 'grape.jpg'),
    (5, '딸기', 8000, \
        '비타민 C나 플라보노이드를 다량 함유하고 있습니다.', 'strawberry.jpg'),
    (6, '귤', 7000, \
        '시네프린을 함유하고 있어 감기 예방에 좋다고 합니다.', 'tangerine.jpg')
]

for row in items:
    sql = "INSERT INTO Product VALUES (:1, :2, :3, :4, :5)"
    cursor.execute(sql)

# 레코드 개수
sql = "SELECT COUNT(*) FROM Product"
cursor.execute(sql)
count = cursor.fetchone()
print("상품 개수:", count[0])

 

전체 레코드 조회

# 전체 레코드 조회
sql = "SELECT * FROM Product"
cursor.execute(sql)

# 한 라인씩 읽음
for row in cursor:
    # print(row)

    # CLOB 필드를 읽는 방법
    description = row[3].read()
    print(row)
    print(description)

 

일부 레코드 삭제

# 일부 레코드 삭제
sql = "DELETE FROM Product WHERE product_id = 6"
cursor.execute(sql)
conn.commit()

 

모든 레코드 삭제

# 모든 레코드 삭제
sql = "DELETE FROM Product"
cursor.execute(sql)
conn.commit()

 

모든 레코드 삽입

# 모든 레코드를 한 번에 INSERT
sql = "INSERT INTO Product VALUES (:1, :2, :3, :4, :5)"
cursor.bindarraysize = len(items)   # 리스트의 개수(6개)를 커서에 전달
cursor.executemany(sql, items)      # 리스트의 개수만큼 반복 처리
conn.commit()

 

모든 레코드 조회 및 저장

# 모든 레코드를 한꺼번에 조회하여 리스트로 저장
sql = "SELECT * FROM Product"
cursor.execute(sql)
rs = cursor.fetchall()
print("\n레코드셋:", rs)
for row in rs:
    description = row[3].read()
    print(row)
    print(description)

 

커서와 커넥션 닫기

cursor.close()
conn.close()