oracle DB사용하기 - minnie0531/fastapi-template GitHub Wiki

FastAPI 와 Oracle DB 연결하기

DB 설치 및 세팅 (docker oracle DB)

  1. docker pull store/oracle/database-enterprise:12.2.0.1(계정 생성 후 trial 버전 가능)
  2. docker run -d -it --name store/oracle/database-enterprise:12.2.0.1
    1. 두개의 DB생성 여기에서 sid 선택해서 가져감(ORCLCDB, ORCLCDB1)
  3. docker exec -it bash -c "source /home/oracle/.bashrc; sqlplus /nolog"
    1. 이대로 실행하면 sqlPlus가 실행됨 접속된게 아니라서 sys로 로그인후 사용가능
    2. connect sys as sysdba
    3. Enter password: Oradoc_db1
  4. Create a new user (sys로 접속하기엔 뭔가 귀찮다 , role도 설정해 줘야 한다.), 권한도 준다
    1. alter session set "_ORACLE_SCRIPT"=true;
    2. create user aaa identified by 1234;
    3. GRANT ALL PRIVILEGES TO aaa; 모두 주자!

python을 이용해서 oracle db에 접속

  1. sqlAlchemy로 구현된 위의 프로젝트를 실행 - 스크립트 돌리지 마자 바로 에러확인 가능. (Wow)- sql developer로 해당 아이디와 비번으로 접속 가능 확인 근데 안됨.
db = cx_Oracle.connect('aaa','1234', 'localhost:1521/sid=ORCLCDB'

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit **Oracle Client library**:
 "dlopen(libclntsh.dylib, 1): image not found". 
See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html
 for help

=> **Oracle Instant Client를 설치하고 이를 통해 Oracle DB접속 가능**
설치 후 아래 path설정
export PATH="/Applications/instantclient_19_8:$PATH"
export ORACLE_HOME="/Applications/instantclient_19_8"
export DYLD_LIBRARY_PATH="/Applications/instantclient_19_8"
export CLASSPATH=$CLASSPATH:$ORACLE_HOME

2.  실행하면 다시 에러 발견!! (Mac에서…)

Developer Cannot be Verified”

아래 들어가서 사용가능 하게 허락해 주시면 됩니다.

****Control Panel -> Security & Privacy -> General tab

3.  Errors..

1. ORA-12154: TNS:could not resolve the connect identifier specified cx_Oracle : 
   아래와 같이 dsn을 만들어 줘서 접속
   1) cx_Oracle
		dsn = cx_Oracle.makedsn(host='0.0.0.0', port=1521, sid='ORCLCDB')
		con = cx_Oracle.connect(user='aaa', password='1234', dsn=dsn)
   2) SQLArlchemy
		dsn = cx_Oracle.makedsn(host='0.0.0.0', port=1521, sid='ORCLCDB')
		engine = create_engine('oracle+cx_oracle://aaa:1234@%s' % str(dsn))

2. ORA-00906: missing left parenthesis
   ORM model definition 에서 String variables에 대해 사이즈 설정이 필요함. 
   Integer는 따로 하지 않아도 됨.

Docker image

기존 linux 이미지와 다르게 위에서 설정한 path및 oracle instant client가 같이 빌드 되어야 합니다.

Oraclelinux:8이상 사용해야지 python3.8 이상 사용가능(fastAPI)

microdnf로 설치 진행

https://yum.oracle.com/oracle-linux-python.html

oraclelinux로 부터 oracle-instantclient, python을 microdnf로 설치하고 pipenv를 이용하여 package 설치

FROM oraclelinux:8-slim

COPY . /src
WORKDIR /src

RUN  microdnf install oracle-instantclient-release-el8 && \
     microdnf install oracle-instantclient-basic && \
     microdnf install python39 &&\
     microdnf install python39-pip &&\
     microdnf clean all

COPY Pipfile /src/Pipfile
COPY Pipfile.lock /src/Pipfile.lock

RUN python3.9 -m pip install pipenv
RUN pipenv install --deploy --system

CMD ["python3.9", "entrypoint.py"]
⚠️ **GitHub.com Fallback** ⚠️