①
DB 설치
Settings.py 파일에는 Django의 설정을 모듈 변수로 표현한 Python 모듈이다.
기본적으로 SqLite를 사용하도록 구성되어
있다.
따라서 데이터베이스를
처음 경험해보거나, Django를 처음 사용해본다면
Django에서 기본적으로 제공하는
SQLite를 사용하는 것도
나쁘지 않은 선택이다.
다만, 나중에 데이터베이스를
교체하느라 골치 아플지도 모르기 때문에, 좀 더 확장성이
있는 데이터베이스를
사용하는 것이 좋다.
이번은 튜토리얼 이기
때문에 SQLite를 사용하도록 하겠다.
・settings.py - TIME_ZONE 변수
먼저 Settings.py 파일에 TIME_ZONE
변수를 시간대에 맞춰서
설정해 줄 것이다.
단, 이번과 같이 가상서버로 서버를 구동한다면 defalut값인 UTC를 사용해야 한다.
특히 윈도우라면 본인 운영체제에 맞는 시간을 사용해야 한다.
이에 대해 공식 도큐먼트에서는 위와 같이 설명한다.
나는 한국의 서울
기준으로 하기로 했다.
・settings.py – USE_I18N 변수
Django의 변역 시스템을
활성화 할지를 결정하는 부울 변수이다.
이 값이 False로 설정되어 있으면, Django가 번역을 하지 않도록
해
프레임워크를 최적화
할 수 있다.
・settings.py – USE_L10N 변수
나라에 맞게 로케일
된 데이터 형식을 사용할지를 결정하는 부울 변수이다.
이 값이 True로 설정되어 있으면, TIME_ZONE의 로케일 형식을
사용하여 숫자와 날짜를 표시한다.
・settings.py – INSTALLED_APPS 변수
프로젝트를 생성한 후에, INSTALLED_APPS 변수에는 기본적으로 포함된다.
해당 앱의 내용은 아래의 사진과 같다.
이런 앱들 중 하나
이상의 데이터베이스 테이블을 사용하므로
데이터베이스에서 테이블을 사용하기 때문에
마이그레이션을
작성해야 사용할 수 있다.
마이그레이션 생성은 아래와
같은 명령어를 입력해야 한다.
python manage.py migrate
이 migrate명령어은 INSTALLED_APPS설정을 확인하고
settings.py파일의 데이터베이스
설정 및 앱과 함께 제공된
[1]데이터베이스 마이그레이션(the database migrations)에 따라 필요한 데이터 베이스
테이블을 만든다.
또한 적용되는 각
마이그레이션에 대한 메시지가 표시된다.
실제 migrate 명령어를 실행해보면
위의 사진과 같이 로그가 화면에 표시된다.
②모델 만들기
이제 모델을 정의해
보려고한다.
여기서 모델이란 부가적인
메타데이터를 가진 데이터베이스의 구조를 말한다.
Django는 고유한 개념 및
데이터는 단 한 번, 단 한 곳에 존재하는 DRY라는 원칙의
철학을 강조한다.
따라서 데이터 모델을
한곳에서 정의하며, 이것으로부터 자동으로
무언가를 유도하는
것이 목표라고 한다.
또한 Django는 모델(Model)이 Ruby On
Rails와 달리 마이그레이션이
포함된다.
따라서 이 마이그레이션은
모델 파일에서 파생되며,
기본적으로 Django는 현재 모델과 일치하도록
데이터베이스 스키마를 업데이트 하기 위해
롤 오버(roll
through)할 수 있다.
여기서는 설문 조사앱에
질문과 선택이라는 두 가지 모델을 만들 것 이다.
질문에는 질문과
출판 날짜가 있고, 선택에는 선택 텍스트와 투표 집계라는
각 두 가지 필드가
존재한다.
이 모델들은 아래와
같이 python 클래스로 프로그래밍
되어진다.
여기서 각 모델은
django.db.models.Model을 서브 클래스하는
클래스로 표시된다.
여기서 각 모델에는
여러 클래스 변수가 있으며, 각 변수는 모델의
데이터베이스 필드를 나타낸다.
즉, 이 변수명을 데이터베이스에서는 컬럼명으로 사용할 것 이다.
따라서 Question클래스의 경우는 question_text(char
형),
pub_date(DateTime 형)이 데이터베이스 필드가,
Choice 클래스의 경우는 question,
choice_text(char 형), votes(Integer 형)가 데이터베이스 필드가
된다.
Field클래스의 경우 첫번째
매개변수를 전달하여 사람이 읽기 편하도록 이름을 지정할 수도 있다.
만약 이 매개변수를
지정하지 않으면, 컴퓨터가 읽기 좋은
형식의 이름을 사용하게된다.
이 예제에서는 Question.pub_date만 정의하도록 하겠다.
몇몇 Field클래스는 반드시 매개변수를
설정해야 하는 Field들이 있다.
CharField의 경우 반드시 max_length를 입력해주어야 한다.
또한 다양한 선택적
매개변수들을 가질 수도 있는데, 이 예제에서는
Default로 하여금 votes의 기본값을 0으로 설정하였다.
마지막으로 ForeignKey를 사용한 관계설정에
대한 경우이다.
이 예제에서는 각각의
Choice클래스가 Question클래스에 관계된다는
것을 Django에 알
려준다.
따라서 Django는 다대일(many to
one), 다대다(many to
many), 일대일(one to
one)과 같은
모든 일반 데이터베이스의
관계들을 지원할 수 있다.
③모델 활성화하기
모델(Model)의 짧은 코드가 실제
Django에게는 많은 양의
정보를 전달하게 된다.
Django는 이 정보를 가지고
아래와 같은 작업을 할 수 있다.
또한 Django의 앱(polls와 같은)들은 “뺐다꼈다”할 수 있다.
즉, 앱을 다수의 프로젝트에서
사용할 수도 있고 배포 할 수도 있다.
따라서 특정
Django프로젝트에 앱들이
묶여있지 않아도 되는 것이 Django가 추구하고자
하는 철학이다.
하지만, 가장 먼저 현재 프로젝트에게
polls앱이 설치되어 있다는
것을 알리는게 우선이다.
현재 앱을 프로젝트에
포함시키기 위해서는 앱(polls)의 클래스에 대한 참조를
setting.py 파일의 INSTALLED_APPS 변수에 추가해야 한다.
해당 클래스는 polls/apps.py내에 존재한다.
따라서 변수에 추가
할 코드는 'polls.apps.PollsConfig'
가 된다.
이제 Django는 polls앱이 포함된 것을
알게 됐다.
그럼 이제 다른 명령어를
내려보자.
python manage.py makemigrations
polls
실행해보면 아래와
같은 로그를 볼 수 있다.
Makemigrations을 실행시켜, 모델을 변경한 사실과
이 변경사항을 migration으로 저장하고
싶다는 것을 Django에게 알려주었다.
여기서 마이그레이션은
Django가 모델(및 데이터베이스 스키마)에 대한 변경 사항을
디스
크에 저장하는 방식을
말한다.
원하는 경우 새 모델의
마이그레이션을 읽을 수 도 있다.
예제의 경우 polls/migrations/polls/0001_initial.py 파일이다
Django가 변경하는 방식을
수동으로 조정하려는 경우에는 사용자가 편집 할 수 있도록
설계되어 있기 때문에
Django를 만들 때 마다
읽을 필요는 없다.
Django에는 이 migration들을 실행시켜줘서
자동으로 데이터베이스 스키마를 관리해주는
migrate명령어가 있다.
이 sqlmigrate명령어는 migration
이름을 인수로 받아
실행된 SQL문을 보여준다.
이번 예제는 0001_initail.py의 migration을 실행할 것이며, 명령어는 아래와 같다.
python manage.py sqlmigrate
polls 0001
성공 시, 위의 사진과 같은
화면을 볼 수 있으며
이 로그들은 실제
모델안에서 데이터들의 코드를 기반으로 Create되어지는 테이블들이 된다.
또한 공식 도큐먼트에서는
위의 사진에 대해 아래와 같은 참고 사항을 적어뒀다.
(외래키의 관게는 FOREIGN
KEY 제약 조건에 명시된다.
다만, 트랜잭션이 끝날 때까지 외래 키를 적용하지 않도록 PostgreSQL에 지시하기 때문에
DEFERRABLE 부분에 대해 걱정하지 않아도 된다.)
(sqlmigrate
명령은 실제로 데이터베이스에서
마이그레이션을 실행하지 않는다.
다만, Django가 필요하다고 생각하는 것을 화면에 출력한다.
이는 Django가 수행 할 작업을 확인 또는 변경을 위해
SQL 스크립트가 필요한 데이터베이스 관리자가 있는지 확인하는 데 유용합니다.)
관심이 있다면 python
manage.py check 명령어를 통해 마이그레이션을 수행하거나,
데이터베이스를 건드리지
않고도 프로젝트의 문제를 확인 할 수 있다.
④모델 적용하기
이제 실제 migrate 명령어를 통해 데이터베이스에
모델과 관련된 테이블을 생성해보자.
해당 실행문은 아래와
같다.
python manage.py migrate
실제 실행하면 위의
사진과 같이 로그가 나오며 마지막에 OK라는 로그가 나온다.
migrate 명령은 아직 적용되지
않는 마이그레이션을 모두 수집해 이를 실행하여,
결과적으로 모델(Model)에서의 변경 사항들과
데이터베이스 스키마의 동기화가 이루어진다.
이 마이그레이션은
매우 강력한 기능이며, 마치 프로젝트를 개발할
때 처럼 데이터베이스나
테이블에 손대지 않고도
모델을 변경할 수 있게 해준다.
또한 동작 중인
데이터베이스를 데이터 손실없이 업그레이드 하는 데 최적화 있기 때문에
Django는 개발자들에게 큰
힘이 되어 줄 것이다.
따라서 모델 변경
및 추가를 하고 싶다면 아래와 같은 과정을 거치면 된다.
①
모델(model.py)을 변경 및 추가 한다.
②
python manage.py makemigration 명령어를 통해,
변경 및 추가에 대한
마이그레이션을 만든다.
③
python manage.py migrate 명령어를 통해 변경 및 추가에 대한 마이그레이션을 적용한다.
위의 사진은 python manage.py
makemigrations 명령어를 사용 할
때 참고되는 0001_initial.py파일이다.
실제 0001_initial.py 파일은 위의 사진과
같이 프로그래밍 되어져 있는데
이전에 models.py파일에 프로그래밍한
class 이름으로 각각의 테이블들이
설정되있는 것과
해당 class안의 변수들이
컬럼명으로 지정되어 있는 것을 확인 할 수 있다.
----------------------------------------------------------------------------------------------------------------------
[1] : 데이터베이스 마이그레이션 이란, 데이터베이스 스키마의 버전을 관리하기 위한
하나의 방법으로 개발
시스템에서 데이터베이스 스키마가 변경되었지만
운영 시스템의 데이터베이스
스키마가 변경되지 않았을 경우 마이그레이션을 수행한다.
마이그레에션은 보통 한 운영체제로부터
다른 운영체제로 옮기는 작업을 말한다.
----------------------------------------------------------------------------------------------------------------------
참고
첫 번째 장고 앱 작성하기, part 2 :