우분투 리눅스에서 python3, django, oracle 19c 사용하기.
* 작업 환경
OS: ubuntu 22.04
ip address : 172.30.124.211 (오라클 설치된 서버 아님)
python: python3.10.12
oracle client: 설치됨.
django: 5.0.4
Oracle 데이터베이스 : SCAN IP 172.30.124.241, 172.30.124.242,172.30.124.243 
* 주의사항
cx_Oracle 패키지를 설치하면 오라클 클라이언트없이 파이썬 스크립트를 작성하고 실행할 수 있다.
하지만 Django 프로그램에서 오라클 데이터베이스를 사용하려면, 오라클 클라이언트가 설치되어 있어야 한다.
오라클 클라이언트 설치는 아래 글을 참고하면 된다.
https://blog.boxcorea.com/wp/archives/3700
1. cx_Oracle 패키지 설치.
(venv) $ pip install cx_oracle Collecting cx_oracle ...
2. 테스트 코드 작성
import cx_Oracle
def test_oracle():
    dsn_tns = cx_Oracle.makedsn(host='172.30.124.242', port='1521', service_name='orcl')
    con = cx_Oracle.connect(user='fox', password='fox123', dsn=dsn_tns)
    cur = con.cursor()
    cur.execute('select * from test')
    for i in cur:
        print(i)
    cur.close()
    con.close()
if __name__ == '__main__':
    test_oracle()
코드 실행 결과 이상 없이 잘 실행됨.
(venv) $ python main.py (2, 'snowfox') (1, 'poss')
3. django 설치.
(venv) $ pip install django
4. django 프로젝트 만들기.
프로젝트 이름 oraTest로 장고 프로젝트를 만든다.
(venv) $ django-admin startproject oraTest
settings.py 가 있는 디렉토리로 이동하고 데이터베이스 항목을 수정한다.
(venv) $ cd oraTest/oraTest/
(venv) oraTest/oraTest$ vi settings.py
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'orcl',     # oracle service name  
        'USER': 'fox',
        'PASSWORD': 'fox123',
        'HOST': '172.30.124.243',
        'PORT': '1521',
    }
이렇게 설정하였으나,
django.db.utils.OperationalError: DPY-6005: cannot connect to database (CONNECTION_ID=eMkjmK1PMCPNdhtYy5Tdwg==).
DPY-6003: SID “orcl” is not registered with the listener at host “172.30.124.241” port 1521. (Similar to ORA-12505)
오류 발생한다.
grid 서비스 이름인 orcl 대신, 각 노드에서 실행중인 SID(orcl1 또는 orcl2) 중 임의의 SID를 설정하면 접속이 잘 된다.
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'orcl2',     # oracle SID (orcl1 또는 orcl2중 하나 설정)
        'USER': 'fox',
        'PASSWORD': 'fox123',
        'HOST': '172.30.124.242',     # SCAN IP 중 임의의 IP 주소 설정
        'PORT': '1521',
    }
}
아래 명령으로 프로젝트 기본 테이블을 만든다.
(venv) snowfox@foo:~/PycharmProjects/conOracle/oraTest$ python manage.py migrate
장고 관리자를 만든다.
(venv) snowfox@foo:~/PycharmProjects/conOracle/oraTest$ python manage.py createsuperuser
오라클 접속하여 테이블 확인해 보면.
snowfox@foo:~$ sqlplus fox/fox123@172.30.124.241/orcl SQL*Plus: Release 21.0.0.0.0 - Production on 금 4월 19 14:53:16 2024 Version 21.13.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. 마지막 성공한 로그인 시간: 금 4월 19 2024 14:52:52 +09:00 다음에 접속됨: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> set heading off SQL> select * from tab; TEST TABLE DJANGO_MIGRATIONS TABLE DJANGO_CONTENT_TYPE TABLE AUTH_PERMISSION TABLE AUTH_GROUP TABLE AUTH_GROUP_PERMISSIONS TABLE AUTH_USER TABLE AUTH_USER_GROUPS TABLE AUTH_USER_USER_PERMISSIONS TABLE DJANGO_ADMIN_LOG TABLE DJANGO_SESSION TABLE 11 행이 선택되었습니다.
위처럼 django 관련 테이블이 만들어 졌다.
* 참고:
아래는 설치된 파이썬 패키지.
(venv) $ pip freeze asgiref==3.8.1 cffi==1.16.0 cryptography==42.0.5 cx-Oracle==8.3.0 Django==5.0.4 pycparser==2.22 sqlparse==0.5.0 typing_extensions==4.11.0