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