프로젝트 중 Python 으로 Oracle 에 접근하여 데이터를 가지고 오는 작업을 수행할 일이 생겨 Mac에서 접근할 수 있는 방법을 정리해보았습니다.
환경 : Mac OS
DB : Oracle
사용언어 : Python
1. Oracle Client Download
Version 19.8.0.0.0
Instant Client for macOS (Intel x86)
- DMG 파일 다운로드
- 다운로드 된 파일을 더블 클릭하고 삽입되도록 한 후 아래 내용을 수행
cd /Volumes/instantclient-basic-macos.x64-19.8.0.0.0dbru
./install_ic.sh
# downlaod 폴더에 다운로드가 됨.
/Users/dave/Downloads/instantclient_19_8
Creating dir: /Users/dave/Downloads/instantclient_19_8...
Copying /Volumes/instantclient-basic-macos.x64-19.8.0.0.0dbru files ...
2. Oracle Folder 정리
2.1 폴더 생성
- 다운로드 받은 내용을 다 instanceclient_19_8 로 복사
- 위에서 설치된 폴더 중 Network 폴더를 제외하고 아래 Oralce Client 폴더로 복사( /Users/dave/Oracle/instantclient_19_8)
mkdir -p /Users/dave/Oracle/instantclient_19_8/lib
# 위에서 설치한 내용을 위 /Users/dave/Oracle/instantclient_19_8/ 로 복사하기
# 심볼릭 링크 생성
ln -s /Users/dave/Oracle/instantclient_19_8/libclntsh.dylib /Users/dave/Oracle/instantclient_19_8/lib/
2.2 환경 변수
sudo vi ~/.zshrc
export ORACLE_HOME=/Users/dave/Oracle/instantclient_19_8
export DYLD_LIBRARY_PATH=/Users/dave/Oracle/instantclient_19_8
export OCI_LIB_DIR=/Users/dave/Oracle/instantclient_19_8
export OCI_INC_DIR=/Users/dave/Oracle/instantclient/sdk/include
export PATH=$PATH:$ORACLE_HOME
source ~/.zshrc
3. cx_Oracle 설치
pip install cx_Oracle
python -m pip install cx_Oracle --upgrade
4. Python 연결
4.1 cx_Oracle 로 direct 연결
import cx_Oracle
#cx_Oracle.init_oracle_client(lib_dir='/Users/dave/Oracle/instantclient_19_8')
host = ""
port = ""
db_name = ""
user_name = ""
password = ""
dsn_tns = cx_Oracle.makedsn(host, port, service_name=db_name)
conn = cx_Oracle.connect(user=user_name, password=password, dsn=dsn_tns, encoding='UTF-8')
sql_query = """
SELECT
* FROM TABLE WHERE between from_date and to_date
"""
sql_query_formatted = sql_query.format(from_date='20230412', to_date='20230412')
c = conn.cursor()
c.execute(sql_query_formatted)
print(c.fetchall())
c.close()
conn.close()
4.2 Pandas DataFrame으로 연결
host = ""
port = ""
db_name = ""
user_name = ""
password = ""
dsn_tns = cx_Oracle.makedsn(host, port, service_name=db_name)
conn = cx_Oracle.connect(user=user_name, password=password, dsn=dsn_tns, encoding='UTF-8')
c = conn.cursor()
#c.execute("SELECT * FROM Table")
c.execute("SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = 'TableName1' ORDER BY COLUMN_ID")
col_data = c.fetchall()
column_list = [col[0] for col in col_data]
c.execute("SELECT * FROM Table WHERE SUBSTR(HG1DDT,1,4) >= '2017'")
data_list = c.fetchall()
df = pd.DataFrame(data_list, columns = column_list)
df = df.fillna('')
c.close()
conn.close()
참조
'Programming > DB' 카테고리의 다른 글
Oracle 테이블 별 용량 및 컬럼 정보 가지고오기 (0) | 2023.07.31 |
---|---|
Maria DB, idb 파일만 남았을 경우 복구. (0) | 2021.04.17 |
Mysql Schedule 추가 (0) | 2016.06.30 |