지금 회사는 외주에게 맡긴 전산프로그램을 쓰고 있다. 근데 유지보수 비용을 지불하지 않아 필요한 개발을 할 수 없는 상황이다. 전산 사용자 자체가 내 업무와는 거리가 있어 사용하기에 너무 불편하고 필요한 자료를 가져오는 것도 한계가 있다. 다행히 라이선스는 구매했다고 하여 데이베이스 접속정보를 얻어 직접 정보를 가져오려고 했다. 나는 파이썬을 사용해서 DB에 직접 접속하고 자료를 가공하고자 했고, 근 보름정도를 끙끙거리며 삽질을 하다가 알게 된 사실을 공유하고자 한다.
1. 오라클 모듈설치
파이썬으로 오라클DB에 접속하려면 cx_oracle을 사용해야 한다. 업데이트가 되어 다른 모듈도 있지만 오라클 버전이 낮으면 접속이 안 되는 듯하다. 그래서 난 기존의 cx_oracle을 사용했다.
해당 모듈 문서링크다.
2. 인스턴트 클라이언트 설치
기존 모듈을 사용하면 인스턴트 클라이언트를 설치해야한다. 아래는 다운로드 링크이다.
https://www.oracle.com/database/technologies/instant-client/downloads.html
난 맥북을 사용하니 instant Client for macOS이고 여러버전이 있는데 난 맨 위에 있는 19.8.0.0.0을 다운로드하였다. 필수로 다운로드해야 하는 건 모르겠다..ㅜㅜ다만 난 basic package, sql*plus packgae, tools package, sdk package를 dmg로 다운로드하였다. 다운로드한 파일을 전부 마운트하고 터미널을 열어서 마운트 된 폴더로 이동한다.
cd /volumes/instantclient-basic-macos.x64-19.8.0.0.0dbru
basic package만 설치하면 나머지 마운트된 것들도 한꺼번에 설치된다고 한다. install_ic.sh 를 넣고 설치한다. 그럼 다운로드 폴더에 instantclient_19_8 폴더가 생성될 것이다. 나중에 이 파일을 작업환경의 lib폴더 밑에 복사해서 넣자.
3. 환경변수설정
ORACLE_HOME=/Users/basic/oracle/instantclient_19_8
LD_LIBRARY_PATH=:/Users/basic/oracle/instantclient_19_8
SQLPATH=/Users/basic/oracle/instantclient_19_8
난 저렇게 환경변수 지정을 했는데 쓸데없는 짓 같다. 위에서 말했듯이 작업환경 lib폴더 안에 넣었다. 하수니까 봐줘라.
4. 테스트코드
import cx_Oracle
# Oracle 데이터베이스에 접속할 정보 설정
db_user = "test"
db_password = "test"
db_host = "test"
db_port = "test"
db_service_name = "test"
# Oracle 데이터베이스에 접속
try:
cx_Oracle.init_oracle_client(lib_dir="./lib/instantclient_19_8")
connection = cx_Oracle.connect(
user=db_user,
password=db_password,
dsn=f"{db_host}:{db_port}/{db_service_name}"
)
print("Oracle 데이터베이스에 접속되었습니다.")
# 접속한 connection 객체를 이용하여 쿼리 또는 업데이트 작업 수행
# 접속 종료
connection.close()
print("Oracle 데이터베이스 접속이 종료되었습니다.")
except cx_Oracle.DatabaseError as e:
print(f"Oracle 데이터베이스 접속 오류: {e}")
여기부터 삽질의 연속. Oracle 데이터베이스 접속 오류: DPI-1047 가 없어질 생각을 안할거다. 별의별 문서를 다 뒤져봐도 답을 찾을 수 없어 친구찬스를 썼다. 너무 간단해서 빡침.
5. mac VScode 터미널 rosetta 설정
https://velog.io/@bk87/Mac-VSCode-terminal-rosetta-setting
Mac VSCode 터미널 rosetta 설정하기
M1에서 VSCode terminal rosetta 로 실행하기
velog.io
위 링크를 참고해라. 난 설치한 기억이 없는데 기본 탑재된 건지 rosetta가 설치되어 있어서 vscode설정만 해줬다.(디폴트 말고 작업환경에 설정해 줘라.) 난 m2인데 잘되더라.
아 그리고 pandas 이런 모듈들 지웠다가 새로 설치해야 할 수 도 있다. 난 접속은 되는데 데이터프레임이 저장이 안돼서 고생하다가 재설치하니 잘되더라.
6. 진행상황
import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine
# Oracle 데이터베이스에 접속할 정보 설정
db_user = "test"
db_password = "test"
db_host = "test"
db_port = "test"
db_service_name = "test"
# Oracle 데이터베이스에 접속 (SQLAlchemy 사용)
try:
cx_Oracle.init_oracle_client(lib_dir="./lib/instantclient_19_8")
# SQLAlchemy 엔진 생성
engine = create_engine(
f"oracle+cx_oracle://{db_user}:{db_password}@{db_host}:{db_port}/{db_service_name}",
echo=False
)
# SQL 쿼리 실행 및 결과를 DataFrame으로 변환
sql_query = "SELECT * FROM test"
df = pd.read_sql(sql_query, engine)
# DataFrame의 첫 1000개 행 출력
print(df.head(1000))
except cx_Oracle.DatabaseError as e:
print(f"Oracle 데이터베이스 접속 오류: {e}")
코드 짤 때는 챗GPT 써라. 두 번 써라.
끝.
'Python' 카테고리의 다른 글
네이버 검색광고 크롤링 - 웹 크롤링 코드 (2) | 2022.12.20 |
---|---|
[Python]BeautifulSoup과 Selenium을 이용한 네이버 검색광고 크롤링 (0) | 2022.12.12 |
댓글