Django의 Model & ORM
Django 는 MVT(Model View Template, MVC와 동일한 의미)패턴을 사용하는 프레임워크이다. Django에서는 Model의 디폴트 DB를 sqlite3로 사용하고 있으며, 이 외 RDBMS와 연동하여 사용할 수 있도록 ORM(Object Relation Mapping, 객체-관계 매핑)을 제공한다. 그리고 우리는 Django Application내에 models.py에 ORM 클래스를 작성하여 DB를 생성하여 준다. 그 후 makemigrations 와 migrate를 이용해서 DB를 초기화해준다. 간단히 이 두 명령어의 차이점을 짚고 넘어가면, makemigrations는 models.py에서 변경한 내용을 기반으로 migration파일을 만드는 것이고, migrate는 생성된 migration파일을 읽어 DB에 적용하는 명령어이다.
하지만 이러한 방법은 어디까지나, "DB를 처음 만드는 경우"에 해당된다. 모델을 처음 만드는 경우에는 DB를 초기화 하고 사용하는 반면, 기존에 가지고 있던 RDB 데이터로는 어떻게 해야할지 난감하다. 불가능 한건가? 라는 질문의 답변은 아니다, 기존에 있던 RDB 데이터로도 웹 애플리케이션을 만들 수 있다.
기존 RDB를 Django model클래스로 migration 하기
테스트 환경 / 필요한 패키지 설치
기존의 RDB를 MySQL이라고 가정하자. 그리고 사용할 테스트 데이터는 아래와 같이 있다고 가정하자.
우선적으로 Django의 DB 엔진을 sqlite3 에서 MySQL로 바꿔주어야 한다. Django MySQL접근 엔진은 mysqlclient 패키지에 의존성을 가지고 있다 그렇기 때문에 설치되어있지 않다면
pip3 install mysqlclient
명령어를 이용해서 설치해준다. 만약
ERROR: Command errored out with exit status 1:
command: /home/netmgr/ipt/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-usjlhpx8/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-usjlhpx8/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-usjlhpx8/mysqlclient/pip-egg-info
cwd: /tmp/pip-install-usjlhpx8/mysqlclient/
Complete output (10 lines):
/bin/sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-usjlhpx8/mysqlclient/setup.py", line 16, in <module>
metadata, options = get_config()
File "/tmp/pip-install-usjlhpx8/mysqlclient/setup_posix.py", line 51, in get_config
libs = mysql_config("libs")
File "/tmp/pip-install-usjlhpx8/mysqlclient/setup_posix.py", line 29, in mysql_config
raise EnvironmentError("%s not found" % (_mysql_config_path,))
OSError: mysql_config not found
위와 같은 오류가 난다면, https://blog.boxcorea.com/wp/archives/2702 이 블로그 포스트를 참고하자.
settings.py 설정하기
위 과정이 끝났다면 본격적으로 MySQL과 연동해 보자. 일반적으로 Django프로젝트를 처음 열면 settings.py의 DATABASE에 아래와 같이 작성되어있을것이다.
참고로 Django가 지원하는 DBMS목록은 아래와 같으니 참고하자
이제 DATABASE부분을 아래와 같이 바꿔준다
DATABASES = {
'default': {
"ENGINE": 'django.db.backends.mysql',
"NAME":"",
"USER":"",
"PASSWORD" : "",
'HOST':"",
"PORT":""
}
}
각 필드가 의미하는것을 해석해보자.
필드 | 설명 |
ENGINE | 사용할 DBMS를 지정해준다 |
NAME | DB이름을 지정해준다 |
USER | user 명 |
PASSWORD | RDBMS 해당 user의 password |
HOST | 호스트를 작성해준다. IP가 될수도, DNS명이 될수도 있다 |
PORT | 데이터 베이스 포트번호, MySQL의 경우 디폴트는 3306이다 |
아래와 같이 문제 없이 작동되면 연동이 된것이다.
DB migration
이제 다시 애플리케이션 작동을 멈추고, DB를 migration하자. migration을 위해서는 아래와 같이 명령어를 입력해 주어야 한다.
python3 manage.py inspectdb > (application이름)/models.py
이제 해당 애플리케이션의 models.py에 들어가보면 아래와 같이 model클래스 작성이 자동으로 되어있는것을 볼 수 있다.
이제 기존의 모델 클래스 작성했을때와 똑같이 makemigrations와 migrate명령어를 사용해 적용해 주자.(settings.py에 해당 애플리케이션이 등록되어있다는 가정하에 작성한다.)
여기까지 왔다면, 기존 RDB와 연동하는 과정이 끝난것이다. 간단하게 잘 연동되었는지 확인하기 위해 템플릿을 작성해 확인해 본다.
'Back-End > Python Django' 카테고리의 다른 글
[Django] static 파일 처리하기 (0) | 2022.04.06 |
---|---|
[Django] DEBUG=False 상태에서 static 파일 사용하기 (0) | 2022.04.05 |
[Django] 함수형 View 클래스형 View로 변경해보기 (0) | 2022.03.06 |
[Django] get_context_data() 메소드의 작동원리 (0) | 2022.03.05 |
[Django] apps.py의 간단한 활용 (0) | 2022.03.05 |