Ubuntu, python3+Django+Oracle19c(grid) 사용하기.

우분투 리눅스에서 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

답글 남기기

Your email address will not be published.