갈루아의 반서재

Using the Django Framework with Python and Oracle Database (1)


본 게시물에서는 파이썬, 장고, 오라클을 이용하여 기존 오라클 데이터베이스의 자료를 조회할 수 있는 페이지를 만들어보고자 한다.


http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/python_django/python_django.htm


파이썬을 만든 Guido van Rossum at PyCon 2013




[1단계]


1. 앞서 밝혔듯이 본 게시물의 작성 목표는 기존에 설치된 Oracle Database 에 연결하여 데이터 조회를 위한 페이지를 만드는 것이다.


2. 본격적인 작업에 앞서 연결할 데이터베이스의 username, password, schema 를 확인한다.


3. Python, Django, cx_Oracle 를 설치한다(이에 대한 설치과정은 필요하다면 별도 게시물로 다룬다).



[2단계]


1. 장고 프로젝트 생성

이클립스를 실행한다(File > New > PyDev Django Project)

Home 디렉토리 아래 해당 프로젝트의 디렉토리가 생성된다.


2. 장고 파일의 기본구성과 역할은 다음과 같다.

init_.py : 파이썬으로 하여금 해당 디렉토리가 파이썬 패키지임을 인식하게 하는 빈 파일
manage.py : 장고 프로젝트를 관리하는 커맨드-라인 스크립트
settings.py : 장고 프로젝트 설정 파일
urls.py : URL 요청을 장고 파일과 매핑하는 파일


3. 실행

이클립스에서 Run As > PyDev:Django


4. 웹브라우저에서 확인

http://localhost:8000/


5. 실행 종료

이클립스 콘솔 창에서 Terminate 버튼을 누른다.


6. 데이터베이스 연결정보 입력

settings.py 파일 Databases 정보에 아래와 같이 입력한다.




7. 어플리케이션 생성

아래와 같이 어플리케이션을 생성한다.


C:>python manage.py startapp bourne_users


장고 프로젝트는 일종의 웹사이트로, 어플리케이션은 웹사이트의 서브 콤포넌트이다. 생성 후 해당 프로젝트 디렉토리 아래에 어플리케이션 디렉토리가 생성되었음을 알 수 있다.


8. 모델 정의하기

models.py의 기본값은 empty.


9. 기존 데이터베이스의 테이블 정보 가져오기

inspectdb 를 이용하여 기존 오라클 데이터베이스의 정보를 가져온다.

C:\>python manage.py inspectdb > bourne_users/models.py



좀 더 자세한 inspectdb 의 기능에 대해서는 아래의 페이지를 참조하세요.

https://docs.djangoproject.com/en/1.8/howto/legacy-databases/


비어있던 models.py 파일이 기존 데이터베이스 정보로 가득찼다.



10. 현재 실습에 불필요한 모델 정리


11. 어플리케이션 등록

settings.py 파일의 INSTALLED_APPS 항목에 아래와 같이 앞서 생성한 어플리케이션을 등록한다.


INSTALLED_APPS = (

    'django.contrib.admin', 

    'django.contrib.auth', 인증관련

    'django.contrib.contenttypes', 컨텐츠타입 프레임워크

    'django.contrib.sessions', 세션 프레임워크

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'bourne_users'

)



INSTALLED_APPS에는 해당 웹사이트에서 활용가능한 어플리케이션의 이름 정보를 담고 있다.


12. 어플리케이션 활성화

선택적인 Django admin 어플리케이션을 활성화시키기 위해서는 setting.py 파일에서 해당 부분 활성화(uncomment)시키고, 데이터베이스랑 동기화해야 한다. 그리고 나서 URL mapping file 을 업데이트해야 한다. 



13. 데이터베이스 동기화


C:\>python manage.py syncdb


장고 1.7 이상에서는 위의 syncdb 가 아니라 아래와 같이 migrate 를 이용해야 한다.

https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-migrate


C:\>python manage.py migrate


syncdb와 다르게, migrate에는 superuser 계정을 생성하는 프롬프트가 뜨지 않는다. 그러므로 superuser 계정 생성을 위해서는 아래와 같이 createsuperuser 를 사용해야 한다.


C:\>python manage.py createsuperuser





동기화 과정에서 다음과 같은 에러가 발생할 수 있다.



ERRORS:

bourne_users.DualInt: (models.E004) 'id' can only be used as a field name if the field also sets 'primary_key=True'.

bourne_users.QuestTempExplain: (models.E004) 'id' can only be used as a field name if the field also sets 'primary_key=True'.

bourne_users.ToadPlanTable: (models.E004) 'id' can only be used as a field name if the field also sets 'primary_key=True'.


System check identified 3 issues (0 silenced).


위의 에러에서 언급된 클래스들을 검색해보면, 해당 클래스의 idprimary_key=True 로 셋팅되어 있지 않음을 알 수 있다. 아래와 같이 primary_key=True 설정을 해주거나 불필요한 클래스의 경우 해당 클래스를 지워버린다.


id = models.AutoField(primary_key=True)

위의 작업 이후 다시 동기화해보면 아래와 같이 정상적으로 실행됨을 알 수 있다.



14. URL mapping 업데이트

15. 위의 user 어플리케이션을 위한 admin 인터페이스 생성bourne_users/admin.py을 아래와 같이 수정한다.

from django.contrib import admin
from bourne_users.models import MstUser
admin.site.register(MstUser)


http://localhost:8000/admin/bourne_users/mstuser/ 에서 어플리케이션이 제대로 작동하는지 살펴보자. 그런데 아래와 같은 에러가 발생했다.


내용을 살펴보면, 기존의 MST_USER 테이블의 PK 가 "ID" 가 아니라 "USN"이라서 발생하는 에러이다.


왜냐하면, 장고는 기본적으로 PK 필드 이름이  id라고 기대하기 때문에 이런 에러가 발생한다.


primary_key=True 라고 넣어줌으로써 장고로 하여금 이 필드가 id 임을 알려주면 된다. 아래와 같이 "USN" 가 primary_key 임을 표시해준다.



composite pk 에 대해서는 아래 링크 참조하세요.

https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys